当前位置:首页 > 问答 > 正文

Redis韩顺平课堂上的那些重点笔记,学起来感觉特别实用和接地气

(韩顺平课堂笔记开始)

Redis是个啥?就是个超级快的“大Map”

别想太复杂,你就把它理解成一个放在内存里的、速度飞快的键值对集合,为啥快?因为数据都存在内存里,读写不用像MySQL那样去硬盘翻找,自然就快了,它的主要任务就是给数据库“减负”,把那些经常被查询、又不怎么变动的“热数据”放在自己这里,比如商品信息、用户会话。

五种常用数据类型,别死记硬背,想想咋用

韩老师讲这个的时候,特别喜欢用生活例子打比方,一下就懂了。

Redis韩顺平课堂上的那些重点笔记,学起来感觉特别实用和接地气

  1. String(字符串):最基础的,就是一个key对应一个value,比如存个验证码:set code:13800138000 123456,还可以用来做计数器,文章点赞数 incr article:1001:likes
  2. List(列表):就是个双向链表,两头都能操作,典型的用场就是消息队列,虽然现在有更专业的MQ,但简单的场景够用了,生产者用 lpush 从左边塞任务,消费者用 rpop 从右边取任务,这就是个FIFO(先进先出)队列,还可以做朋友圈点赞列表。
  3. Set(集合):自动去重,无序,最经典的就是共同好友功能,用户A的好友ID放一个set,用户B的好友ID放一个set,用 sinter 命令一求交集,共同好友就出来了,还有抽奖活动,用 sadd 加参与人,自动去重,防止重复参与。
  4. Hash(哈希):相当于Java里的Map,或者数据库里的一行记录,这个是韩老师强调存储对象的首选,比如存用户信息,别用String把整个用户对象序列化成JSON存,那样修改一个字段就得整个覆盖,用Hash:hset user:1001 name "张三" age 28,这样要改年龄,直接 hset user:1001 age 29 就行了,高效又灵活。
  5. Zset(有序集合):带分数的Set,能排序。排行榜的天然实现,比如游戏积分榜,成员是用户ID,分数是积分。zadd leaderboard 10000 user1zrevrange leaderboard 0 9 就能取出前十名,还有根据时间戳排序的需求,也能用它。

持久化:怕断电丢数据?有两个“备份”大招

数据在内存里,服务器一关机就全没了,所以得想办法存到硬盘上,这就是持久化。

  1. RDB(快照):韩老师比喻成“拍照片”,在某个时间点,把整个内存数据生成一个快照文件(dump.rdb)存起来,优点是恢复数据快,因为这个文件就是个完整的数据备份,缺点是可能会丢数据,比如你设置5分钟拍一次照,如果服务器在拍照后第4分钟宕机,那这4分钟的数据就没了。
  2. AOF(日志):比喻成“记日记”,把每次写操作命令都记录下来,追加到一个文件里,重启的时候,把日记里的命令重新执行一遍,数据就恢复了,优点是数据安全,最多丢一秒的数据(可以配置),缺点是日记文件会越来越大,恢复速度比RDB慢。

韩老师建议:生产环境通常两个都开着,用AOF保证数据安全,用RDB做冷备和快速恢复。

事务:Redis的事务有点“愣”

Redis韩顺平课堂上的那些重点笔记,学起来感觉特别实用和接地气

Redis的事务不像MySQL那样有复杂的回滚机制,它就是一串命令打包,按顺序执行,中间不会被别的客户端命令打断,这保证了“隔离性”,但它没有“原子性”,意思是如果事务里一个命令出错了,后面的命令还会继续执行,它不会回滚,韩老师提醒:用的时候要自己保证命令的正确性。

主从复制:一主多从,读写分离

一台Redis怕扛不住?那就搞个“集群”,主从模式就是:一台主节点(Master)负责写,多台从节点(Slave)负责读,并且从节点自动从主节点那里同步数据,这样好处是:读写分离,减轻主节点压力;数据备份,从节点就是主节点的副本;高可用基础,主节点挂了,可以从从节点里选一个新的主。

缓存穿透、击穿、雪崩:面试必问,实际问题

Redis韩顺平课堂上的那些重点笔记,学起来感觉特别实用和接地气

这是韩老师讲的重点中的重点,非常实用。

  1. 缓存穿透查一个根本不存在的数据,比如恶意请求一个不存在的商品ID,这个ID缓存里没有,就会一直去查数据库,把数据库打垮。

    • 解决布隆过滤器,在缓存之前加一层布隆过滤器,它能快速判断一个key是否存在,如果布隆过滤器说不存在,那这个请求直接返回,根本不会去查缓存和数据库。
  2. 缓存击穿一个热点key过期了,瞬间大量请求砸向数据库,就像保险丝在用电高峰时熔断了一样。

    • 解决热点key永不过期,或者加互斥锁,第一个请求发现key过期,先去加个锁(比如用Redis的setnx命令),然后去数据库加载数据回填缓存,期间其他请求等待或者返回默认值,填完缓存后再释放锁。
  3. 缓存雪崩大量的key在同一时间过期,导致所有请求都去查数据库,数据库瞬间压力过大崩掉。

    • 解决给key的过期时间加上随机值,比如原本都设置10分钟过期,现在改成10分钟加上一个0到5分钟的随机数,这样key就不会在同一时刻大面积失效了。

一些接地气的小技巧

  • Key的命名:用冒号分隔,清晰易懂。业务名:对象名:idshop:user:1001
  • 批量操作:多用 mgetmsetpipeline 减少网络请求次数,提升性能。
  • 避免大Key:一个key对应的value太大(比如一个list里有几十万元素),会导致操作慢、网络阻塞,要拆解。

韩老师总结的核心思想就是:Redis是利器,但要用对地方,它不是为了替代数据库,而是作为缓存和提速工具,和数据库配合使用,扬长避短。

(韩顺平课堂笔记结束)