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

Redis知识点梳理和思维导图,边想边用中间有点乱但挺实用

(来源:根据个人学习和使用Redis的零散笔记整理)

Redis这个东西,我一开始学的时候觉得就是个缓存,比数据库快,用着用着发现,它里面的门道还挺多,而且很多功能你不用到的时候根本想不起来,现在我就边想边写,把我脑子里关于Redis的东西捋一捋,可能有点乱,但都是实践中感觉有用的点。

Redis知识点梳理和思维导图,边想边用中间有点乱但挺实用

核心是键值对,但值有很多花样

这是根本,Redis不是简单的key-string(键-字符串),那太浪费了,它的值有五种基本类型,这是基础,必须得知道。

Redis知识点梳理和思维导图,边想边用中间有点乱但挺实用

  1. String(字符串):最常用,就是缓存个用户信息、验证码、序列化后的对象啥的,但它不光是存文本,还能存数字,并且能对数字做操作,比如递增(INCR)、递减(DECR),这个特性用来做网站访问量计数、秒杀商品的库存扣减就特别方便,因为它是原子性的,不会超卖。
  2. Hash(哈希):这个类型对我理解Redis的实用帮助很大,它像个小的Map,里面还能有field(字段)和value(值),比如我要存一个用户的信息,如果用String,我得把整个用户对象序列化成JSON字符串存进去,修改一个字段(比如昵称)也得整个读出来,改完再整个存回去,用Hash就可以直接对某个字段操作(HGET user:1 name, HSET user:1 name "新名字"),特别适合存储对象。
  3. List(列表):就是个链表,两头都能进能出,我主要用它做两种事:一是当消息队列用,左边放(LPUSH),右边取(RPOP),虽然功能没专业的MQ强大,但简单的异步任务、削峰填谷够用了,二是做个简单的动态列表,比如朋友圈的时间线,新发的消息LPUSH进去,展示的时候LRANGE取一部分。
  4. Set(集合):自动去重,无序,这个功能太有用了,给文章点赞,一个用户只能点一次,用SADD往文章点赞集合里加用户ID,自动就去重了,还能求交集(SINTER)、并集(SUNION),比如找两个人的共同好友。
  5. Sorted Set(有序集合):带分值的集合,按分值排序,这是实现排行榜的“神器”,比如游戏积分榜,玩家ID是成员,积分是分值,ZADD添加,ZREVRANGE按排名取,天然就是排行榜,还有做延迟队列,用时间戳做分值,定时去取。

光有类型不够,还得知道怎么让它“听话”

数据类型是基础,但怎么用好,得靠一些特性和命令。

Redis知识点梳理和思维导图,边想边用中间有点乱但挺实用

  • 过期时间(Expire):这是Redis作为缓存的核心功能,任何一个key都可以设置一个过期时间(TTL),到点自动删除,设缓存的时候一定要记得设,不然内存就爆了,可以用EXPIRE命令设,也可以在SET的时候直接加EX参数。
  • 持久化:Redis数据在内存里,一断电就没了,所以得想办法存到硬盘上,有两种方式,我自己的理解是:
    • RDB(快照):像个定时拍照,隔一段时间把整个内存数据拍个照存成文件,优点是恢复快,文件小,缺点是可能会丢失最后一次拍照到宕机之间的数据。
    • AOF(日志):像个写日记,把所有写的命令都记录下来,优点是数据安全,最多丢一秒的数据(如果配置成每秒同步一次),缺点是文件会越来越大,恢复慢。
    • 生产环境我一般是两个都开,用AOF保证数据不丢,用RDB做冷备和快速恢复。
  • 事务:Redis的事务(MULTI/EXEC)跟数据库的不太一样,它不是说失败了能回滚,而是保证一系列命令按顺序执行,不会被别的客户端命令打断,就是个打包执行的过程,所以它没有原子性,中间命令出错,后面的还会继续执行,这点一开始很容易搞错。
  • 内存淘汰策略:当内存满了,再往里写数据怎么办?Redis有好几种策略让你选,比如LRU(淘汰最近最少用的)、LFU(淘汰使用频率最低的)、随机淘汰等,这个得根据业务来选,比如做缓存通常选LRU。

实际用的时候会碰到的“坑”和技巧

  • 慢查询:Redis本来是快的,但一些命令如果用不好就会慢,比如keys *,数据量一大就直接卡死,得用scan命令代替,还有对大集合做交集并集,也要小心。
  • 缓存问题:经典的缓存穿透(查不存在的数据,每次都打到数据库)、缓存击穿(一个热点key过期,大量请求瞬间打爆数据库)、缓存雪崩(大量key同时过期),解决办法也简单,穿透用布隆过滤器或者缓存空值;击穿用互斥锁;雪崩给过期时间加个随机值。
  • 集群模式:单机Redis扛不住了,就得上集群,主从复制(Master-Slave)是做读写分离和备份的,分片集群(Cluster)是把数据分到多个实例上,解决单机内存不够的问题,哨兵(Sentinel)是管主从自动切换的,主库挂了,它能选个从库当新主库。

思维导图的核心脉络:

脑子里大概可以这么画个图:最中间是 Redis键值对

  • 伸出去五个主干:String, Hash, List, Set, Sorted Set,每个主干后面再挂上它们的特性和典型应用场景。
  • 再伸出去几个主干:数据特性(过期时间、持久化RDB/AOF、事务)、运维保障(内存淘汰策略、慢查询优化)、高可用架构(主从、哨兵、集群)。
  • 最后再伸出一个分支:常见问题与解决方案(缓存穿透/击穿/雪崩)。

这么一想,虽然知识点零碎,但结构就清晰多了,用的时候,先想我要存什么数据,用什么数据结构最合适,然后考虑怎么保证它不丢、不慢、高可用,基本上就能应付大部分场景了。