Redis工程
工程问题|工具库
Contents
缓存读问题
缓存击穿
用户访问的数据不在缓存中也不在数据库中时,该请求会经过缓存、DBMS,但是依然没有查询到结果。高并发情况下,可能会引起DBMS的崩溃。 引发原因:
- 数据库中没有对应数据
- 缓存没有对空结果进行缓存
解决方案:
- 对非法请求进行限制
- 对空结果进行缓存
- 在请求缓存之前先采用布隆过滤器对不存在的情况进行提前返回
缓存穿透
当热点数据失效时,会高并发的直接访问DBMS,引起DBMS崩溃。
解决方案:
- 热点数据设置永不失效
- 限制访问DBMS并发量
缓存雪崩
大量的key在同一时间失效,导致大量请求直接访问DBMS,引起崩溃
解决方案:
- 在过期时间上加上随机过期时间
- 提高DBMS容灾能力、分库分表
缓存写问题
缓存和数据库不一致
以下场景在高并发情况下均会引起数据库和缓存不一致
- 修改DB后更新缓存
- 修改DB后删除缓存
本质原因在于并发情况下修改数据库和修改缓存两个操作不是原子性的。
解决方案
- 延时双删,针对“修改DB后删除缓存”的场景,在修改DB后执行两次删除操作,时间间隔为T,T>从查到结果到更新redis的时间耗时。只是降低发生不一致的概率。
- 队列,将并行操作变为串行。性能降低
- 分布式锁