想玩转Redis?这些基础和进阶知识你得先搞明白才行
- 问答
- 2026-01-08 00:49:04
- 7
整理自微信公众号“程序员小灰”的推文《想玩转Redis?这些知识你得先搞明白》以及博客园“匠心独运”系列文章)
Redis到底是什么?
你可以把Redis理解成一个“超级快”的字典(或键值对)服务器,它跟MySQL那种需要硬盘的数据库不一样,它的数据主要放在内存里,所以读写速度极快,每秒能处理几十万次请求,它常被用来做缓存(把常用的数据放这里,减轻后面大数据库的压力),也可以当简单的消息队列用。(来源:程序员小灰)
Redis支持哪些常见的数据类型?(来源:程序员小灰 & 匠心独运博客)
别以为Redis只能存简单的字符串,它支持好几种数据结构,这也是它强大的地方:
- String(字符串):最基础的类型,可以存文本、数字甚至图片序列化后的数据,比如存个用户昵称:
set user:1:name "张三"。 - List(列表):一个有序的字符串列表,你可以从左边或右边插入/弹出元素,像排队一样,常用来做消息队列或最新消息列表。
- Hash(哈希):适合存储对象,比如一个用户信息有姓名、年龄、城市,你可以用一个Hash来存:
hset user:1 name "张三" age 30 city "北京",这样比存多个独立的String更高效。 - Set(集合):一个无序且元素唯一的集合,可以用来存文章的标签,或者求两个用户的共同好友(求交集)。
- Sorted Set(有序集合):和Set类似,但每个元素都关联一个分数(score),可以根据分数排序,排行榜功能最适合用它,比如根据游戏分数给玩家排名。
为什么Redis这么快?(来源:匠心独运博客)

- 内存存储:这是最主要的原因,直接读写内存比读写硬盘快好几个数量级。
- 单线程模型:你可能觉得多线程更快,但Redis核心操作是单线程的,这避免了多线程复杂的竞争和上下文切换问题,使得操作非常利索,新版本在一些非核心操作上也用了多线程。
- 高效的数据结构:Redis自己实现了一套精良的数据结构,比如简单动态字符串、跳跃表等,都是为了速度而优化的。
- I/O多路复用:这个词听起来复杂,但你可以理解为一个大管家(一个线程)能同时监听很多个网络连接,哪个连接有活来了就马上处理,避免了无谓的等待,网络IO效率很高。
进阶知识:持久化(来源:程序员小灰 & 匠心独运博客)
既然数据都在内存里,万一服务器断电或者重启了,数据不就全没了吗?Redis提供了两种主要的“持久化”机制,把数据存到硬盘上以防万一:
- RDB(快照):在特定的时间间隔,把内存里的数据完整地拍一张“快照”保存到硬盘上,恢复的时候直接读入内存就行,很快,缺点是如果两次快照之间宕机,会丢失那段时间的数据。
- AOF(追加日志):把每一次写操作命令都记录到一个日志文件里,当Redis重启时,会重新执行一遍日志里的所有命令来恢复数据,这样数据丢失的风险很低(可以配置成每秒同步一次),但日志文件会比较大,恢复速度也比RDB慢。
生产环境通常会把两者结合使用,用AOF保证数据安全,用RDB做冷备或快速恢复。

进阶知识:缓存问题(来源:匠心独运博客)
用Redis做缓存时,会遇到几个经典问题:
- 缓存穿透:有人一直请求一个数据库中根本不存在的数据(比如不存在的用户ID),请求会每次都绕过缓存打到数据库上,可能把数据库压垮。解决办法:即使查不到数据,也在缓存里存个空值(并设置短一点的过期时间),或者用布隆过滤器提前判断数据是否存在。
- 缓存击穿:某个非常热点的数据过期了,这时大量请求同时涌来,全部打到数据库上。解决办法:设置热点数据永不过期,或者使用互斥锁(比如Redis的setnx命令),只让一个请求去数据库查,其他请求等待。
- 缓存雪崩:大量缓存数据在同一时间大面积过期,或者Redis服务宕机,导致所有请求都涌向数据库。解决办法:给缓存过期时间加上随机值,避免同时过期;或者搭建Redis集群(主从复制、哨兵模式)实现高可用。
Redis还有其他高级玩法(来源:程序员小灰)
除了做缓存,Redis还能干很多事:
- 分布式锁:在分布式系统中,多个服务节点要协调时,可以用Redis的setnx命令来实现一个简单的分布式锁,保证同一时间只有一个节点能执行关键操作。
- 消息队列:利用List的push和pop命令,可以实现一个简单的消息队列,更复杂的可以用Pub/Sub(发布/订阅)功能。
Redis看似简单,但要想真正“玩转”,从基础的数据类型到持久化、缓存策略、高可用架构等进阶知识都需要深入了解,希望这些点能给你一个清晰的学习路线。
本文由酒紫萱于2026-01-08发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/76510.html
