Redis 基础教程
一个 基于内存 的 Key-Value 数据库,支持持久化,读写极快,常用于缓存、消息队列、分布式系统。
- 延迟:微秒级
- QPS:10w~50w+
- 采用 I/O 多路复用 + 单线程模型(执行命令仍是单线程)
Redis 的高性能来自四点:
- 完全基于内存操作
- 单线程避免锁竞争
- I/O 多路复用(epoll)处理大量连接
- 高效的数据结构(不是“字符串”,是 SDS、自研的哈希表等)
- 命令执行:单线程
- 网络处理(从 6.0 开始):I/O 多线程
- 后台任务(RDB/AOF 重写):独立线程
核心逻辑仍是单线程,这才保证高性能与一致性。
Redis 内部使用 对象系统 + 编码(encoding)
常见编码方式:
- raw(普通字符串)
- embstr(短字符串优化)
- int(整数优化)
- hash(ziplist / hashtable)
- listpack、skiplist(ZSet)
即:Redis 是高度工程化的数据结构库。
- String(字符串 / 数值 / 缓存)
- Hash(对象)
- List(队列)
- Set(去重集合)
- Sorted Set(排行榜、有序集合)
每个都有自己的底层结构和适用场景。
- Bitmap(位图:签到、活跃用户)
- HyperLogLog(UV 统计:固定 12KB)
- GEO(地理位置:底层 ZSet)
- Stream(消息队列:持久化 MQ)
- 周期性把内存保存为二进制文件
- 恢复快
- 会丢失最近一次快照之后的数据
- 写命令追加日志
- 丢数据少
- 文件会越来越大(支持重写)
生产一般:RDB + AOF 混合模式(默认)
当内存满了,Redis 要清理 key。
常见策略:
- volatile-lru
- allkeys-lru(做缓存常用)
- volatile-ttl
- noeviction(不建议使用,会直接报错)
- 核心命令执行:一条主线程
- I/O:多线程(处理读写)
- 持久化:后台线程
优点:无锁竞争、高性能、实现简单
缺点:命令阻塞会卡住整个 Redis(如 KEYS、SMEMBERS 大 key)
一次发送多条命令,减少网络 RTT
适用于:批量写、批量读
注意:
- Pipeline 不是原子操作
- 不同于事务、Lua
使用:
MULTI
...
EXEC
特点:
- 不支持回滚(非 ACID)
- 只保证命令按顺序执行
生产不常用,通常改用 Lua + 原子。
Redis 中最强大的原子操作方式:
优势:
- 逻辑在服务器侧执行(减少 RTT)
- 所有命令原子性执行
适用:
- 分布式锁释放
- 限流(滑动窗口)
- 批处理
- 16384 槽位(hash slot)
- key 按槽分配到不同节点
- 自带主从和自动故障迁移
客户端必须支持 cluster 协议,否则无法访问分片数据。
- 第一次:全量同步(RDB 文件 + 增量命令)
- 后续:增量同步(命令流)
- 断点恢复:offset + runid
从库基本是只读,用于分流读请求。
查询不存在的数据导致一直打到数据库
解决:布隆过滤器 / 空值缓存
大量 key 同时过期
解决:随机 ttl / 多级缓存
热点 key 过期瞬间被高并发请求击溃
解决:互斥锁 / 永不过期 + 后台异步更新
Redis = 内存数据库 + 高性能数据结构库 + 缓存系统 + 持久化引擎 + 分布式消息队列 + 分布式协调组件
核心能力包括:
- 单线程极速架构
- 高效数据结构
- 多种持久化
- 高可用(主从 / Sentinel / Cluster)
- 高性能(百万 QPS)
- 丰富模型(锁、限流、队列)