缓存常见问题
Redis 常作为数据库前面的缓存层。缓存能降低数据库压力,但也会引入一致性、穿透、击穿、雪崩等问题。
一、缓存读取流程
常见读取流程:
伪代码:
二、缓存穿透
缓存穿透指查询的数据在缓存和数据库里都不存在。
如果大量请求都查不存在的数据,每次都会打到数据库。
示例:
常见处理:
缓存空值示例:
读取时遇到 __NULL__,直接返回空结果,不再查数据库。
三、缓存击穿
缓存击穿指某个热点 key 过期,瞬间大量请求同时查数据库。
示例:
常见处理:
互斥锁思路:
拿到锁的请求查数据库并重建缓存;没拿到锁的请求可以短暂等待后重试,或返回旧值。
四、缓存雪崩
缓存雪崩指大量 key 在同一时间过期,导致请求集中打到数据库。
常见原因:
- 批量导入缓存时 TTL 都相同。
- Redis 节点异常。
- 热点缓存集中失效。
常见处理:
TTL 随机值示例:
五、缓存和数据库一致性
常见写流程:
示例:
下一次读取时,缓存未命中,再从数据库加载新数据。
不推荐先更新缓存再更新数据库,因为数据库更新失败时缓存里可能已经是新值。
六、延迟双删
某些高并发场景中,可能出现旧数据被重新写回缓存。
延迟双删思路:
这不是万能方案。等待时间取决于业务请求耗时和数据库延迟,使用前要评估复杂度。
多数普通后台系统先使用“更新数据库后删除缓存”,再根据实际并发问题优化。
七、缓存 key 排查
常用排查命令:
批量扫描:
生产环境避免直接执行:

