0%

Redis 缓存常见异常处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
缓存不一致
先删除缓存,再更新数据库
问题: A 删除缓存后,更新 db 前,B 查询数据,缓存中没有到 db 中读到了旧数据,将旧数据设置到了缓存中
解决:在 A 更新完数据库值以后,让它先 sleep 一小段时间,再进行一次缓存删除操作。(延迟双删)
先更新数据库值,再删除缓存值
问题:A 更新完 db 还没删除缓存前,B 查询数据命中就缓存,获取到旧数据,这个问题无解,但对业务影响较小。
推荐这种方式
先删除缓存值再更新数据库,有可能导致请求因缓存缺失而访问数据库,给数据库带来压力
如果业务应用中读取数据库和写缓存的时间不好估算,那么,延迟双删中的等待时间就不好设置。

缓存血崩
原因
大量数据同时过期
缓存实例宕机
应对方案
给过期时间加随机数
服务降级、熔断、限流
主从集群

缓存击穿
原因:热点数据过期
应对方案
不给热点数据设置过期时间
将数据提升为本地缓存

缓存穿透
原因:缓存和数据库中都没有要访问的数据
误删数据
恶意攻击
应对方案
缓存空值或缺省值
使用布隆过滤器
前端合法性检查