2021-05-01 22:04:36
Redis 缓存异常主要包括缓存和数据库不一致、雪崩、击穿、穿透四种情况,以下是具体异常及应对策略:
缓存和数据库不一致操作失败导致的不一致:引入重试机制,将数据暂存到消息队列中。无论哪项操作失败,都从消息队列中重新读取这些值,再次进行删除或更新。若删改成功,则把数据从消息队列中去除,避免重复操作;多次重试仍然失败,需业务层面预警排查解决。
并发请求导致的不一致:采用“延迟双删”操作保证先操作缓存后操作数据库的数据一致性。代码示意如下:

大量数据同时过期:
微调过期时间:对于同一批数据设置不同的过期时间,如通过随机数延迟过期等。
降级处理:非核心数据请求直接返回空或错误等预置信息,核心数据在未命中缓存时访问数据库。

Redis 缓存实例挂了:
熔断:拒绝缓存客户端的请求,保护数据库,防止整个系统崩溃,直到 Redis 缓存实例恢复正常。但此方法对业务应用的影响范围大。
限流:允许部分请求到达 Redis 缓存,无法命中再访问数据库,减轻数据库压力。相对于熔断,影响范围稍微缩小。

预防措施:构建 Redis 缓存高可靠集群,尽量避免事故发生。


缓存空值或缺省值:针对穿透的数据,在 Redis 中缓存一个空值或是和业务层协商确定的缺省值,避免大量请求发送给数据库。
布隆过滤器:由一个初值都为 0 的 bit 数组和 N 个哈希函数组成。数据入库时进行标记,过程如下:
使用 N 个哈希函数,分别计算这个数据的哈希值,得到 N 个哈希值。
把这 N 个哈希值对 bit 数组的长度取模,得到每个哈希值在数组中的对应位置。
把对应位置的 bit 位设置为 1,完成在布隆过滤器中标记数据的操作。当查询某个数据时,按照哈希函数的计算结果,查看 bit 数组中这 N 个位置上的 bit 值,只要有一个不为 1,就表明布隆过滤器没有对该数据做过标记。当缓存穿透发生时,布隆过滤器的快速检测特性可以帮数据库阻挡大部分压力。

前端请求过滤:在请求入口前端进行合法性检测,把恶意的请求(如请求参数不合理、非法值或请求字段不存在)直接过滤掉。
