Redis基础
一、Redis 基础核心 🔴
1、Redis 是什么?
Redis 是一款高性能、基于内存、键值对、非关系型数据库。
支持多数据结构、持久化、集群、高可用、分布式锁,互联网行业标准缓存中间件。
2、Redis 为什么速度极快 🟠
-
纯内存操作:没有磁盘IO,读写纳秒级。
-
单线程模型:避免多线程锁竞争、上下文切换。
-
IO多路复用:epoll,少量线程管理大量连接。
-
数据结构极致优化:底层编码紧凑、压缩存储。
-
简单协议:Redis自定义简单二进制协议,解析快。
注意:Redis6.0以后有多线程,但是主线程依旧单线程处理命令。
3、单线程为什么不会CPU瓶颈?
Redis瓶颈不在CPU,瓶颈在网络IO和内存,单线程足够打满网卡。
二、五大基础数据类型 + 底层编码 🔴
1、String 字符串
底层结构:SDS 简单动态字符串
-
不是原生C字符串,自带长度属性
-
杜绝缓冲区溢出
-
预分配内存、减少扩容次数
-
结尾带0,兼容C函数
三种编码
-
int:纯数字字符串
-
embstr:短字符串(小于44字节),内存连续
-
raw:长字符串,内存不连续
使用场景
缓存、计数器、分布式自增、限流、验证码。
2、List 列表
底层:QuickList(快速列表)
ZipList + LinkedList 结合。
低数据量压缩链表,高数据量双向链表,兼顾内存和性能。
场景:消息队列、时间轴、排队列表。
3、Hash 哈希
底层编码
-
ZipList:字段少、值小,压缩存储
-
Dict(哈希表):数据量大自动转换
场景:存储对象、用户信息、购物车。
4、Set 集合
底层编码
-
IntSet:纯数字、压缩数组
-
Dict:乱序、非数字
场景:去重、交集、并集、好友共同关注。
5、ZSet 有序集合
底层编码
-
ZipList:少量数据压缩
-
SkipList 跳跃表:大数据量有序排序
为什么不用红黑树?
跳跃表结构简单、插入删除快、范围查询极强,更适合Redis。
场景:排行榜、延时队列、权重排序。
三、内存过期 + 淘汰策略 🔴
1、过期删除策略(三种)
-
定时删除:主动删除,耗CPU,不用
-
惰性删除:访问时判断过期,节省CPU,浪费内存
-
定期删除:轮询随机抽样删除,折中方案
Redis默认:惰性删除 + 定期删除结合。
2、八大内存淘汰策略 🔴
2.1 四类规则
-
volatile-lru:过期key最少使用优先删(最常用)
-
allkeys-lru:全部key最少使用优先删
-
volatile-ttl:过期时间最短优先删
-
volatile-random:过期key随机删
-
allkeys-random:全部随机删
-
noeviction:不删除,直接报错(默认)
2.2 生产推荐
线上缓存业务:volatile-lru。
四、持久化机制 🔴
1、RDB 快照持久化
原理
定时把内存数据二进制快照写入磁盘。
触发方式
-
手动 save、bgsave
-
配置规则:比如 900秒改1次
-
停机自动保存
优缺点
-
优点:体积小、恢复快、适合备份
-
缺点:可能丢失最后一次快照数据、实时性差
2、AOF 日志持久化
原理
记录每一条写命令,重启回放命令恢复数据。
三种刷盘策略
-
always:每次写入刷盘,安全最慢
-
everysec:每秒刷盘,折中(默认)
-
no:交给操作系统,不安全
优缺点
-
优点:几乎不丢数据、安全性极高
-
缺点:文件大、恢复慢
3、生产组合方案 🔴
RDB + AOF 混合持久化:
先加载RDB快照,再回放AOF增量命令,兼顾速度+安全。
五、缓存三大经典问题 🔴
1、缓存穿透
现象
查询不存在数据,Redis没有,每次直达数据库。
解决方案
-
空值缓存(过期时间短)
-
布隆过滤器拦截不存在key
-
接口参数校验、黑名单拦截
2、缓存击穿
现象
热点key突然过期,大量请求瞬间打入数据库。
解决方案
-
热点key永不过期
-
互斥锁(Redisson)
-
本地缓存+Redis二级缓存
3、缓存雪崩
现象
大量key同时过期 / Redis宕机,数据库压力爆炸。
解决方案
-
过期时间加随机值,打散过期
-
搭建集群高可用,防止宕机
-
限流、熔断、降级
-
多级缓存兜底
六、Redis分布式锁 🔴
1、最简锁(有坑)
SET NX EX:加锁;DEL:解锁。
问题:死锁、误删、锁续期、原子性差。
2、Lua脚本(保证原子)
判断+删除写在一个Lua脚本,防止误删别人锁。
3、Redisson(生产主流)
核心功能
-
看门狗续命:业务没执行完,自动延长过期时间,防止死锁
-
可重入锁
-
公平锁、读写锁、联锁
-
加锁、解锁全程Lua原子操作
4、Redlock红锁(了解)
多台独立Redis同时加锁,过半成功才算加锁成功,保证极端高可用。
普通业务不用,金融支付才用。
七、高可用架构(主从+哨兵+集群)
1、主从复制
原理
-
全量复制:初次同步,RDB传输
-
增量复制:偏移量,积压缓冲区同步命令
缺点
主节点宕机无法自动切换,人工运维。
2、哨兵模式 Sentinel
作用
监控、心跳检测、自动故障转移、自动选主。
容错机制
-
主观下线:单个哨兵判定宕机
-
客观下线:过半哨兵判定宕机,开始选举
缺点
只有一台主节点,无法扩容、海量数据存不下。
3、集群模式 Cluster(生产主流)
3.1 基础规则
-
16384 个哈希槽
-
公式:hash(key) % 16384
-
至少 3主3从
3.2 分片倾斜 🔴
现象:部分节点槽位数据过多,压力不均。
原因:哈希扎堆、热key、槽位分配不均、批量前缀key。
解决方案:
-
随机后缀打散key
-
HashTag固定哈希槽
-
人工迁移槽位
-
热key单独部署、本地缓存
3.3 集群优缺点
-
优点:横向扩容、海量数据、高可用、自动转移
-
缺点:不支持多键批量操作、事务弱、复杂命令受限
八、进阶
1、缓存一致性问题
更新策略对比
-
先更数据库,再删缓存(生产推荐):一致性最好、最简单
-
先删缓存再更库:短期脏数据概率高
-
双写更新:过期时间不一致,极易错乱
最终一致性方案
延时双删 + 过期时间兜底 + MQ异步补偿。
2、大key问题
危害
网卡打满、阻塞主线程、集群迁移卡顿、内存溢出。
解决
拆分key、压缩存储、禁止存超大字符串、定时扫描清理。
3、热key问题
危害
流量集中单节点,节点被打垮、集群雪崩。
解决
本地缓存、多副本备份、随机后缀打散、网关限流。
九、生产优化总结 🔴
-
禁止存大key、禁止存空数据、控制过期时间
-
集群部署、主从+哨兵/集群,保证高可用
-
分布式锁必须用Redisson,不用手写Lua
-
内存淘汰策略使用volatile-lru
-
持久化RDB+AOF混合,保证数据安全
-
批量操作尽量使用Pipeline减少网络IO
-
禁止大量同时过期,时间加随机偏移
十、 总结
Redis是高性能内存数据库,底层单线程+IO多路复用速度极快;
底层包含五大基础数据类型,SDS、QuickList、跳跃表等优化结构;
采用惰性+定期删除清理过期key,线上使用volatile-lru淘汰策略;
持久化采用RDB+AOF混合方式兼顾恢复速度与数据安全;
存在缓存穿透、击穿、雪崩三大问题,分别用布隆过滤器、永不过期、集群限流解决;
分布式锁推荐Redisson,自带看门狗防死锁;
高可用分为主从、哨兵、集群,集群采用16384哈希槽分片,存在分片倾斜问题通过打散key、HashTag解决;
生产采用先改库后删缓存保证一致性,同时规避大key、热key,做好内存和网络优化。