Redis 全体系深度解析(架构原理、性能模型、使用场景、持久化机制、过期策略与最佳实践)
Redis 是现代互联网系统中最核心的基础组件之一。
几乎所有高并发、高流量项目都会把 Redis 放进架构里作为「缓存 + 分布式协调服务 + 高速存储」。
下面从 Redis 的本质出发,把它的优势、原理、场景、持久化、安全与一致性体系完整讲清楚。
一、Redis 是什么?为什么要用 Redis?
Redis 是一个基于内存、支持持久化、支持多种数据结构的高性能数据库。
更准确地说,它是一个内存存储系统 + 分布式协调组件 + 高性能 KV 引擎。
为什么现代系统必须用 Redis?
1. 内存存储:比数据库磁盘 I/O 快几个数量级。
读写速度可以达到 10 万~百万级别 QPS,数据库根本无法承受高并发压力。
2. 数据结构丰富:比 Memcached 更灵活。
Redis 支持字符串、列表、集合、有序集合、哈希、位图、HyperLogLog、GEO、Streams 等。
3. 功能非常多:
缓存、分布式锁、限流、队列、排行榜、会话管理、计数器、发布订阅、布隆过滤器……
这是 MySQL、MQ、ETCD 都难以替代的场景。
4. 客户端丰富、生态成熟,易扩展、易运维。
所以 Redis 已经成为互联网架构的标配。
二、Redis 为什么是单线程?为什么这么快?
Redis 最经典的两个问题:单线程 + 高性能
表面矛盾,但本质上是一种“极致优化”。
1. Redis 单线程的原因
Redis 早期定位是一个「基于内存的数据结构服务器」。
关键思想:瓶颈不是 CPU,而是 IO 操作。
单线程带来的优势:
- 没有线程切换开销(避免上下文切换)
- 没有加锁、无竞争(数据结构操作简单且安全)
- 代码逻辑更简单、执行路径更短
Redis 的真正瓶颈是网络 IO 和内存访问速度,不是 CPU。
2. Redis 为什么这么快?
Redis 快来自四点:
1)纯内存操作(内存是数据库的 1000 倍速度)
2)单线程无锁架构(线程切换是昂贵的)
3)高效数据结构(C 语言 + 精心实现的结构)
例如:
- ziplist(压缩列表)
- skiplist(跳表)
- intset(整数集合)
- quicklist(列表)
- hash(两个底层结构动态转换)
4)IO 多路复用(epoll)
完全利用操作系统事件驱动模型,大幅提升网络吞吐能力。
总结一句话:
Redis 是“单线程 + 多IO复用 + 内存 + 高效数据结构”的组合拳。
三、Redis 的核心使用场景
Redis 被称为“万能中间件”,但核心使用场景可以归类:
1. 缓存(最主要)
- 查询缓存
- 用户Session缓存
- 热点数据加速
- 分页缓存
2. 计数与限流
- 点赞计数
- PV/UV 统计
- Token Bucket 限流
- 接口访问频率控制
3. 排行榜与热点榜单
使用 zset 优势非常大。
4. 分布式锁
SET NX + EX
或 Redisson 提供的可重入锁、公平锁、读写锁等。
5. 消息队列
- list(简单队列)
- Stream(持久化队列)
在某些场景可取代 Kafka。
6. 布隆过滤(大规模查询去重)
避免数据库穿透。
7. GEO 地理位置
周边人搜索、定位、打车等。
8. 事务与 Lua
可以实现强一致的业务操作。
Redis 的生态远比传统缓存更广。
四、Redis 的数据类型与典型使用场景
1. String(字符串)
最基础类型
应用:缓存、计数、分布式锁、本地配置开关
2. Hash(哈希)
适合存储小对象
应用:用户信息、商品信息等 KV 型结构
3. List(列表)
应用:消息队列、时间线、任务队列
4. Set(集合)
应用:去重、共同好友、标签系统
5. Sorted Set(有序集合)
应用:排行榜、延迟队列、权重统计
6. BitMap
应用:每日签到、统计活跃用户
7. HyperLogLog
应用:去重计数(大数据场景)
8. GEO(地理位置)
应用:附近的人、物流、地图
9. Stream(流)
应用:消息队列(Redis 官方逐渐替代 list 模式)
Redis 的类型强大在于:不仅快,还能解决数据结构问题。
五、Redis 的持久化机制:RDB + AOF
Redis 虽然是内存数据库,但支持持久化,两种机制:
1. RDB(快照)
RDB 是内存快照,将 Redis 整体数据转储到磁盘。
触发方式包括:
1)手动触发
SAVE (阻塞)
BGSAVE(后台快照)
2)自动触发(redis.conf)
save 900 1
save 300 10
save 60 10000
表示:多少秒内如果有多少次写入,则触发。
RDB 优点
- 文件小
- 恢复速度快
- 很适合备份、冷数据归档
- 对性能影响小(后台进程执行)
RDB 缺点
- 数据可能丢失最近一次快照和实际内存之间的内容(非实时)
2. AOF(追加日志)
AOF 将每一次写操作以追加方式写入文件。
AOF 是写前日志还是写后日志?
AOF 是 写后日志(write-after-log)
即:命令执行完成,再写入日志。
这是保证简单性和正确性的关键。
AOF 写入策略(appendfsync)
- always(每次写后 fsync,最安全最慢)
- everysec(每秒 fsync,性能好,最多丢 1 秒)
- no(依赖 OS 刷盘,不推荐)
AOF 优点
- 比 RDB 更高的数据可靠性(丢失少)
- 可读性强(文本命令)
AOF 缺点
- 文件比较大
- fsync 会影响性能
- 重写(rewrite)过程复杂
实际应用中常采用:
RDB + AOF 混合持久化
兼顾性能与可靠性。
六、Redis 过期与淘汰机制
1. 设置过期时间
EXPIRE key seconds
SET key value EX seconds
永久有效:
PERSIST key
2. Redis 删除过期 key 的方式
Redis 采用「惰性删除 + 定期删除」组合:
- 惰性删除:访问时发现过期,才删
- 定期删除:后台随机抽样清理
七、Redis 内存淘汰策略(非常关键)
当内存满时,Redis 采用以下策略之一(maxmemory-policy):
1. noeviction(默认)
不淘汰,新写入失败(适用于缓存不允许丢)
2. allkeys-lru(最常用)
淘汰最少使用的 key
3. allkeys-random
随机淘汰
4. volatile-lru
淘汰带过期时间中的最少使用 key
5. volatile-ttl
按 TTL 即将过期优先淘汰
最常用:
allkeys-lru + 设置 maxmemory
八、Redis 为什么不适合作为最终一致性数据库?
缺点包括:
- 单线程(虽然是优点也有天花板)
- 内存成本高
- 持久化存在极端丢失可能性
- 复制是异步为主(不强一致)
- 不支持复杂查询(SQL)
- failover 秒级损失不可避免
Redis 的定位永远是高性能中间件,而非数据库替代品。
九、Redis 的高可用与分布式能力结构
Redis 高可用组三件套:
1. 主从复制(Replication)
- 异步复制
- 从库可读
- 主挂了,从库可能丢写
2. Sentinel(哨兵)
- 监控主节点
- 自动故障转移
- 高可用
3. Redis Cluster(分片集群)
- 多主多从
- 自动数据分区(哈希槽)
- 故障自动转移
- 支持扩容
这是 Redis 的生产级架构。
十、Redis 调优与最佳实践
1. Key 设计
- 不要太长
- 用冒号分层(如 user:1001:name)
- 避免全量 keys 操作(keys 命令危险)
2. 使用合适的数据结构
- ZSet 做排行榜
- BitMap 做签到
- HyperLogLog 做大规模去重
- Stream 做消息队列
3. 设置过期时间避免缓存雪崩
4. 使用 Lua 保证原子性(如红包系统)
5. 避免大 key(导致阻塞)
6. 使用 Pipeline 批处理减少 RTT
总结:Redis 的本质
Redis 的本质是:
一个极致优化的内存数据库 + 完整的分布式协调组件。
它的核心价值来自:
- 单线程 + IO 多路复用 + 内存数据结构
- 强大的数据类型
- 持久化机制(RDB/AOF)
- 主从复制与集群
- 过期与淘汰策略
- 高可扩展性与高性能
