Appearance
Redis 基础与持久化
Redis 的优缺点与速度来源
Redis 是内存数据结构服务器,常用于缓存、计数器、排行榜、分布式协调、流式消息等。
优势:内存访问延迟低;提供丰富数据结构和原子命令;支持过期、事务、Lua 脚本、复制、哨兵和集群;单线程命令执行模型使单命令原子语义直观。
代价:数据主要驻内存,容量和成本受限;持久化与复制是异步/可配置的,故障场景要评估数据丢失窗口;大 key、慢命令和热 key 会阻塞事件循环或形成热点;不应把 Redis 当作默认的关系数据库替代品。
它快的主要原因是内存数据访问、高效编码/数据结构、事件驱动 I/O 与较少锁竞争,而不是“单线程本身一定比多线程快”。
常用数据类型
| 类型 | 用途示例 |
|---|---|
String | 缓存对象、计数器、分布式锁标记 |
Hash | 对象的字段-值映射 |
List | 双端队列、简单消息队列 |
Set | 去重、共同好友/标签集合运算 |
ZSet | 排行榜、按分数范围查询 |
Bitmap | 签到、在线位图等布尔状态 |
HyperLogLog | 海量数据去重计数的近似基数统计 |
GEO | 地理坐标、附近位置查询 |
Stream | 可消费组读取的追加式消息流 |
具体内部编码会随元素数量和长度变化,例如小型集合可能采用紧凑编码;不宜只按抽象类型推断内存成本。
单线程还是多线程?
Redis 的命令执行(数据读写与大多数核心逻辑)以单线程事件循环为主,因此同一实例内普通命令按顺序执行,避免了命令执行时的数据竞争。后台持久化、删除等任务可由额外线程/子进程完成。
Redis 6 起可配置多线程处理部分网络 I/O,但命令执行的核心模型仍以单线程为主。高性能的前提是命令足够短:避免 O(N) 大命令、超大 value/collection、阻塞 Lua 脚本和同步慢操作。
持久化机制
| 方式 | 原理 | 优点 | 代价 |
|---|---|---|---|
| RDB 快照 | 在某时刻把内存数据写成紧凑二进制快照 | 恢复快、文件紧凑 | 两次快照之间的数据可能丢失 |
| AOF | 追加记录写命令,重启时重放 | 可按 fsync 策略缩小丢失窗口 | 文件更大、恢复通常较慢,需要重写 |
| 混合持久化 | AOF 重写文件前段使用 RDB,后段保留增量命令 | 兼顾恢复速度和数据完整性 | 运维与配置需理解清楚 |
AOF 的 appendfsync always/everysec/no 在持久性和性能间取舍;everysec 常见,但异常断电仍可能丢失约一秒数据。持久化不是备份的完全替代,还需要副本、备份和恢复演练。