1. Redis 概述

1.1 定义

RedisRemote Dictionary Server,远程字典服务器)是开源、内存型、高性能的 NoSQL 键值数据库,C 语言编写,支持多数据结构、持久化和高可用,是目前主流的缓存与中间件。

1.2 核心设计理念

  • 内存优先:全内存操作,性能极致
  • 单线程核心:规避锁竞争与上下文切换开销
  • 简洁高效:功能精简,拒绝过度设计

1.3. 核心特性

  • 超高性能:单机读写 10 万+ QPS,IO 多路复用 + 高效 RESP 协议
  • 多数据结构:支持 10+ 种常用数据结构,远超普通缓存
  • 持久化能力:RDB、AOF 双机制,保障数据不丢失
  • 全套高可用:主从复制、哨兵、集群三种架构
  • 丰富扩展功能:事务、Lua 脚本、发布订阅、消息队列
  • 渐进式多线程:6.0+ 网络 IO 多线程,核心命令执行保持单线程,兼顾性能与稳定性

2. 数据类型与底层结构

2.1 常用数据类型及场景

数据类型 核心特点 典型场景
String(字符串) 最基础类型,支持文本、数字 缓存、计数器、分布式锁、限流
Hash(哈希) 键值对集合,适配对象存储 用户/商品信息、购物车
List(列表) 有序可重复,双向操作 消息队列、时间线、评论列表
Set(集合) 无序去重,支持交集/并集/差集 标签、共同好友、抽奖、去重统计
ZSet(有序集合) 带 score 权重排序,去重有序 排行榜、延迟队列、权重排序
Bitmap(位图) 位运算,极致省内存 用户签到、在线状态统计
HyperLogLog 概率统计,固定 12KB 内存 UV 独立访客统计、大数据去重计数
Geospatial 地理位置计算、范围查询 附近的人/店铺、距离计算
Stream 持久化消息队列,支持消费组 异步消息、业务解耦

2.2 核心底层结构

  • SDS:自定义动态字符串,二进制安全、O(1) 获取长度,替代 C 原生字符串
  • 压缩列表 / listpack:小数据存储,内存紧凑(7.0+ listpack 解决连锁更新问题)
  • 快速列表 quicklist:List 底层,链表 + 压缩列表结合,兼顾性能与内存
  • 字典 hashtable:Hash / Set 底层,渐进式 rehash,避免卡顿
  • 跳跃表 skiplist:ZSet 底层,O(log n) 读写,平衡性能开销

3 常用核心命令

3.1 通用键命令

EXISTS DEL UNLINK(异步删键) EXPIRE / PEXPIRE TTL / PTTL PERSIST SCAN(替代 KEYS) TYPE

3.2 五大基础类型核心命令

类型 核心命令
String SET / GETINCR / DECRSETNXSETEXMGET / MSET
Hash HSET / HGETHGETALLHINCRBYHKEYS / HVALS
List LPUSH / RPUSHLPOP / RPOPLRANGELLENLTRIM
Set SADD / SMEMBERSSISMEMBERSINTER / SUNION / SDIFFSPOP
ZSet ZADDZRANGE / ZREVRANGEZSCOREZINCRBYZREM

3.3 过期删除策略

采用 惰性删除 + 定期删除 组合:

  • 惰性删除:访问过期键即时删除
  • 定期删除:每 100ms 随机抽检删除过期键,规避 CPU 峰值压力

4. 事务与持久化机制

4.1 Redis 事务

  • 指令MULTI(开启)、EXEC(执行)、DISCARD(放弃)、WATCH(乐观锁)
  • 特性:顺序执行、无回滚、不支持原子回滚(单条失败不影响其他命令)

4.2 持久化机制

4.2.1 RDB(快照持久化)

定时异步生成内存数据快照,文件紧凑、恢复速度快。

  • 优点:恢复快、文件小、性能影响低
  • 缺点:可能丢失最后一次快照后的增量数据,fork 子进程可能短暂卡顿

4.2.2 AOF(日志持久化)

记录所有写操作命令,实时性高、数据安全。支持自动重写压缩文件,7.0+ 支持多分段 AOF,提升恢复效率。

同步策略

策略 说明
always 实时同步,最安全、最慢
everysec 每秒同步一次(推荐
no 系统自动同步

4.2.3 混合持久化(推荐)

Redis 4.0+ 支持,AOF 文件头部存储 RDB 快照,尾部追加增量命令,兼顾恢复速度和数据安全性

[ RDB 快照数据 | AOF 增量命令 ]

5. 内存管理与淘汰策略

5.1 核心淘汰策略(内存满时触发)

策略 说明
allkeys-lru(推荐) 所有键淘汰最近最少使用
allkeys-lfu 所有键淘汰最少访问(4.0+,适配热点数据)
volatile-ttl 过期键中淘汰最早过期的
noeviction 不淘汰,直接报错(默认)

5.2 内存优化要点

  • 优化键名长度
  • 合理使用压缩结构阈值
  • 关闭 THP(Transparent Huge Pages)
  • 开启自动内存碎片整理
  • 规避大 key / 热 key

6. 高可用架构

6.1 主从复制

一主多从,主写从读,实现数据冗余与读写分离

  • 全量复制:初始同步,BGSAVE + RDB 传输
  • 增量复制:断连续传,基于 replication backlog 环形缓冲区
  • 注意:存在异步复制延迟问题

6.2 哨兵模式(Sentinel)

监控主从节点,自动故障转移、节点发现。

  • 主观下线(SDOWN)→ 客观下线(ODOWN)判断机制
  • 基于 Raft 算法选举哨兵 leader
  • 实现主节点自动切换,适配中小型集群

6.3 集群模式(Cluster)

去中心化分布式架构,将数据分为 16384 个哈希槽分片存储。

  • slot = CRC16(key) % 16384
  • 支持水平扩容、节点故障自愈
  • 适配大数据量、高并发场景

核心限制

  • 不支持多数据库(仅 db0)
  • 跨槽位多键操作需 Hash Tag 适配
  • 跨节点事务/Lua 脚本不支持

7. 管道与发布订阅

7.1 管道(Pipeline)

批量打包多条命令一次发送,减少网络 RTT 开销,无原子性保障,适合批量读写场景。

Client  →  [CMD1, CMD2, CMD3]  →  Redis
Client  ←  [RES1, RES2, RES3]  ←  Redis

7.2 发布订阅(Pub/Sub)

消息发布与订阅解耦,支持普通订阅和模式订阅。

  • 优点:实时性好,实现简单
  • 缺点:消息不持久化、断线丢失数据
  • 适用:实时通知、配置热更新等非可靠场景

8. Stream 消息队列

Redis 5.0+ 持久化消息队列,弥补 Pub/Sub 不可靠的缺陷

核心能力

能力 说明
消息持久化 消息不丢失
消费者组 同组消息独占消费
消息 ACK 消费确认机制
超时重传 XCLAIM 认领超时消息
消息回溯 支持重新消费历史消息

核心命令XADDXREADXREADGROUPXACKXPENDINGXCLAIM


9. 性能优化

9.1 核心优化点

层面 优化措施
客户端 使用连接池、Pipeline、批量命令,禁用 KEYS 大遍历
服务端 优化持久化策略、开启碎片整理、合理配置内存淘汰
业务侧 拆分大 key、打散热 key、规避批量过期

9.2 常见问题

  • 大 key:引发网络卡顿、删除阻塞、主从延迟 → 需拆分优化
  • 热 key:单节点压力过载 → 通过本地缓存、多副本打散解决

10. 核心使用场景和技术对比

10.1 核心使用场景

场景 实现方式
热点缓存 旁路缓存(Cache Aside),解决数据库压力
分布式锁 SET NX PX + Lua 释放,保证原子性
接口限流 固定窗口 / 滑动窗口限流
排行榜系统 ZSet 实现实时排序
签到统计 Bitmap 极致省内存
延迟队列 ZSet 时间戳权重实现
地理位置服务 GEOADD / GEORADIUS 附近的人/店铺
消息队列 Stream 实现可靠异步通信

缓存三大问题与解决方案

问题 原因 解决方案
缓存穿透 查询不存在的数据 布隆过滤器、缓存空值
缓存击穿 热点 Key 瞬间过期 互斥锁、逻辑过期
缓存雪崩 大量 Key 同时过期 过期时间加随机值、多级缓存、集群高可用

10.2 核心技术对比

维度 Redis Memcached Etcd
数据结构 丰富(10+ 种) 仅 String 基本 KV
持久化 RDB + AOF 不支持 磁盘持久化
一致性 最终一致(异步) 强一致(Raft)
性能 极高(10 万+ QPS) 中等(万级 QPS)
高可用 主从/哨兵/集群 客户端哈希 Raft 集群
适用场景 缓存、队列、排行榜 简单缓存 配置中心、服务发现
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐