Redis基础

目录

一、Redis 基础核心 🔴

1、Redis 是什么?

Redis 是一款高性能、基于内存、键值对、非关系型数据库

支持多数据结构、持久化、集群、高可用、分布式锁,互联网行业标准缓存中间件。

2、Redis 为什么速度极快 🟠

  1. 纯内存操作:没有磁盘IO,读写纳秒级。

  2. 单线程模型:避免多线程锁竞争、上下文切换。

  3. IO多路复用:epoll,少量线程管理大量连接。

  4. 数据结构极致优化:底层编码紧凑、压缩存储。

  5. 简单协议:Redis自定义简单二进制协议,解析快。

注意:Redis6.0以后有多线程,但是主线程依旧单线程处理命令。

3、单线程为什么不会CPU瓶颈?

Redis瓶颈不在CPU,瓶颈在网络IO和内存,单线程足够打满网卡。

二、五大基础数据类型 + 底层编码 🔴

1、String 字符串

底层结构:SDS 简单动态字符串

  • 不是原生C字符串,自带长度属性

  • 杜绝缓冲区溢出

  • 预分配内存、减少扩容次数

  • 结尾带0,兼容C函数

三种编码

  1. int:纯数字字符串

  2. embstr:短字符串(小于44字节),内存连续

  3. raw:长字符串,内存不连续

使用场景

缓存、计数器、分布式自增、限流、验证码。

2、List 列表

底层:QuickList(快速列表)

ZipList + LinkedList 结合。

低数据量压缩链表,高数据量双向链表,兼顾内存和性能。

场景:消息队列、时间轴、排队列表。

3、Hash 哈希

底层编码

  1. ZipList:字段少、值小,压缩存储

  2. Dict(哈希表):数据量大自动转换

场景:存储对象、用户信息、购物车。

4、Set 集合

底层编码

  1. IntSet:纯数字、压缩数组

  2. Dict:乱序、非数字

场景:去重、交集、并集、好友共同关注。

5、ZSet 有序集合

底层编码

  1. ZipList:少量数据压缩

  2. SkipList 跳跃表:大数据量有序排序

为什么不用红黑树?

跳跃表结构简单、插入删除快、范围查询极强,更适合Redis。

场景:排行榜、延时队列、权重排序。

三、内存过期 + 淘汰策略 🔴

1、过期删除策略(三种)

  1. 定时删除:主动删除,耗CPU,不用

  2. 惰性删除:访问时判断过期,节省CPU,浪费内存

  3. 定期删除:轮询随机抽样删除,折中方案

Redis默认:惰性删除 + 定期删除结合。

2、八大内存淘汰策略 🔴

2.1 四类规则

  1. volatile-lru:过期key最少使用优先删(最常用)

  2. allkeys-lru:全部key最少使用优先删

  3. volatile-ttl:过期时间最短优先删

  4. volatile-random:过期key随机删

  5. allkeys-random:全部随机删

  6. noeviction:不删除,直接报错(默认)

2.2 生产推荐

线上缓存业务:volatile-lru

四、持久化机制 🔴

1、RDB 快照持久化

原理

定时把内存数据二进制快照写入磁盘。

触发方式

  • 手动 save、bgsave

  • 配置规则:比如 900秒改1次

  • 停机自动保存

优缺点

  • 优点:体积小、恢复快、适合备份

  • 缺点:可能丢失最后一次快照数据、实时性差

2、AOF 日志持久化

原理

记录每一条写命令,重启回放命令恢复数据。

三种刷盘策略

  1. always:每次写入刷盘,安全最慢

  2. everysec:每秒刷盘,折中(默认)

  3. no:交给操作系统,不安全

优缺点

  • 优点:几乎不丢数据、安全性极高

  • 缺点:文件大、恢复慢

3、生产组合方案 🔴

RDB + AOF 混合持久化

先加载RDB快照,再回放AOF增量命令,兼顾速度+安全。

五、缓存三大经典问题 🔴

1、缓存穿透

现象

查询不存在数据,Redis没有,每次直达数据库。

解决方案

  1. 空值缓存(过期时间短)

  2. 布隆过滤器拦截不存在key

  3. 接口参数校验、黑名单拦截

2、缓存击穿

现象

热点key突然过期,大量请求瞬间打入数据库。

解决方案

  1. 热点key永不过期

  2. 互斥锁(Redisson)

  3. 本地缓存+Redis二级缓存

3、缓存雪崩

现象

大量key同时过期 / Redis宕机,数据库压力爆炸。

解决方案

  1. 过期时间加随机值,打散过期

  2. 搭建集群高可用,防止宕机

  3. 限流、熔断、降级

  4. 多级缓存兜底

六、Redis分布式锁 🔴

1、最简锁(有坑)

SET NX EX:加锁;DEL:解锁。

问题:死锁、误删、锁续期、原子性差。

2、Lua脚本(保证原子)

判断+删除写在一个Lua脚本,防止误删别人锁。

3、Redisson(生产主流)

核心功能

  1. 看门狗续命:业务没执行完,自动延长过期时间,防止死锁

  2. 可重入锁

  3. 公平锁、读写锁、联锁

  4. 加锁、解锁全程Lua原子操作

4、Redlock红锁(了解)

多台独立Redis同时加锁,过半成功才算加锁成功,保证极端高可用。

普通业务不用,金融支付才用。

七、高可用架构(主从+哨兵+集群)

1、主从复制

原理

  1. 全量复制:初次同步,RDB传输

  2. 增量复制:偏移量,积压缓冲区同步命令

缺点

主节点宕机无法自动切换,人工运维。

2、哨兵模式 Sentinel

作用

监控、心跳检测、自动故障转移、自动选主。

容错机制

  1. 主观下线:单个哨兵判定宕机

  2. 客观下线:过半哨兵判定宕机,开始选举

缺点

只有一台主节点,无法扩容、海量数据存不下

3、集群模式 Cluster(生产主流)

3.1 基础规则

  • 16384 个哈希槽

  • 公式:hash(key) % 16384

  • 至少 3主3从

3.2 分片倾斜 🔴

现象:部分节点槽位数据过多,压力不均。

原因:哈希扎堆、热key、槽位分配不均、批量前缀key。

解决方案

  1. 随机后缀打散key

  2. HashTag固定哈希槽

  3. 人工迁移槽位

  4. 热key单独部署、本地缓存

3.3 集群优缺点

  • 优点:横向扩容、海量数据、高可用、自动转移

  • 缺点:不支持多键批量操作、事务弱、复杂命令受限

八、进阶

1、缓存一致性问题

更新策略对比

  1. 先更数据库,再删缓存(生产推荐):一致性最好、最简单

  2. 先删缓存再更库:短期脏数据概率高

  3. 双写更新:过期时间不一致,极易错乱

最终一致性方案

延时双删 + 过期时间兜底 + MQ异步补偿。

2、大key问题

危害

网卡打满、阻塞主线程、集群迁移卡顿、内存溢出。

解决

拆分key、压缩存储、禁止存超大字符串、定时扫描清理。

3、热key问题

危害

流量集中单节点,节点被打垮、集群雪崩。

解决

本地缓存、多副本备份、随机后缀打散、网关限流。

九、生产优化总结 🔴

  1. 禁止存大key、禁止存空数据、控制过期时间

  2. 集群部署、主从+哨兵/集群,保证高可用

  3. 分布式锁必须用Redisson,不用手写Lua

  4. 内存淘汰策略使用volatile-lru

  5. 持久化RDB+AOF混合,保证数据安全

  6. 批量操作尽量使用Pipeline减少网络IO

  7. 禁止大量同时过期,时间加随机偏移

十、 总结

Redis是高性能内存数据库,底层单线程+IO多路复用速度极快;

底层包含五大基础数据类型,SDS、QuickList、跳跃表等优化结构;

采用惰性+定期删除清理过期key,线上使用volatile-lru淘汰策略;

持久化采用RDB+AOF混合方式兼顾恢复速度与数据安全;

存在缓存穿透、击穿、雪崩三大问题,分别用布隆过滤器、永不过期、集群限流解决;

分布式锁推荐Redisson,自带看门狗防死锁;

高可用分为主从、哨兵、集群,集群采用16384哈希槽分片,存在分片倾斜问题通过打散key、HashTag解决;

生产采用先改库后删缓存保证一致性,同时规避大key、热key,做好内存和网络优化。