中间件速查手册
缓存与 KV 存储 · redis

Redis

内存里的万能瑞士军刀,缓存和分布式锁都靠它

缓存与 KV 存储BSD-3-Clause(7.4 起 RSALv2/SSPLv1 双协议)C学习难度:入门

Redis 把数据放在内存里,单机十万级 QPS 很轻松。它不只是缓存:String、Hash、List、Set、ZSet、Bitmap、HyperLogLog 这些结构能做排行榜、计数器、分布式锁、限流、消息队列。用它的关键不是会不会命令,而是知不知道缓存会怎么坏。

01

它解决什么问题

数据库每秒只能扛几千次查询,首页热门商品却要被访问几十万次。每次都查库,数据库直接被打挂。

真实场景:典型场景:商品详情先查 Redis,命中直接返回;没命中查 MySQL 再写回 Redis,并设置随机过期时间,避免同一时刻集体失效。

02

核心概念

每个概念一句话 + 一个类比。点击卡片看更详细的解释。

03

数据流转动画

跟着步骤看一条数据从进入系统到被处理完的完整路径,可以暂停、重播和调速。

Flow animation

一次缓存读取的完整路径

业务服务getProduct(1)Redis内存 KVMySQL持久化存储AOF 日志每条写命令RDB 快照定时全量

← 左右滑动查看完整流程图 →

01 / 05
1. 先查缓存

业务代码先 GET product:1,绝大多数请求在这一步就返回了。

提示:命中就返回,未命中才回源;写回时记得加随机过期时间。 悬停图中的节点可以看概念解释。

04

优劣势

短句说清适合什么、不适合什么,选型时先看这一栏。

适合什么
  • 内存读写,延迟亚毫秒,QPS 十万级
  • 数据结构丰富,计数器/排行榜/队列都能做
  • 支持过期、Lua 脚本、事务、发布订阅
  • 部署简单,单机就能跑,运维成本低
不适合什么
  • 内存贵,容量受限于机器内存
  • 单线程处理命令,大 key 会阻塞整个实例
  • 持久化不是强一致,宕机可能丢秒级数据
  • 主从异步复制,故障切换可能丢数据
05

常见使用场景

每个场景都配一句「为什么用它」。

01

热点数据缓存

商品详情、用户会话、配置项放 Redis,挡住 90% 以上的读请求。

为什么用它:把随机 IO 变成内存访问,数据库只承担回源流量。

02

分布式锁与限流

SET key value NX EX 抢锁,或用 INCR + 过期做计数器限流。

为什么用它:多实例部署时,本地锁不管用,需要一个公共的裁决者。

03

排行榜与计数

ZSet 存分数做实时排行榜,Hash 存对象字段做增量更新。

为什么用它:ZSet 的跳表结构让范围查询和排名都是 O(log N)。

07

常见问题

上手第一个月最容易卡住的地方。

Q1缓存和数据库一致性怎么保证?

常用 Cache Aside:读时先缓存后库;写时先更新库、再删除缓存(不是更新缓存)。仍可能短暂不一致,用延迟双删或订阅 binlog(Canal)异步删缓存兜底。强一致场景别用缓存。

Q2分布式锁怎么实现?

SET lock:order:1 uuid NX EX 30 抢锁,value 存唯一标识,释放时用 Lua 脚本比对 value 再 DEL,防止误删别人的锁。生产环境更推荐 Redisson 的看门狗续期。

Q3缓存穿透、击穿、雪崩怎么区分?

穿透是查不存在的数据(用布隆过滤器/空值缓存);击穿是单个热点 key 失效(用互斥锁或逻辑过期);雪崩是大量 key 同时失效或实例挂了(用随机过期 + 多级缓存 + 熔断降级)。

Q4RDB 和 AOF 怎么选?

RDB 文件小、恢复快,但可能丢几分钟数据;AOF 更安全(everysec 最多丢 1 秒),文件更大恢复更慢。生产一般两个都开:RDB 做冷备,AOF 做增量。

Q5Redis 是单线程的,为什么还这么快?

纯内存操作、IO 多路复用、单线程避免锁竞争和上下文切换。6.0 之后网络 IO 是多线程的,命令执行仍是单线程,所以一条慢命令照样会卡住所有人。