异常处理
缓存雪崩
原因
由于原有缓存失效,新缓存未到的时候,如设置缓存采用了相同的过期时间,在同一时刻出现大面积的缓存过期, 那么本来访问缓存的请求都去查询数据库了,对CPU和内存造成巨大压力,严重会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
解决方案
-
1. 大多数系统设计者考虑用加锁或者队列的方式避免大量线程对数据库一次性读写,导致失效时大量并发请求落到底层存储系统上
-
2. 将缓存失效时间分开。
-
3. 使用熔断机制。当流量到达一定阈值时,就直接返回”系统繁忙”之类的提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。
-
4. 提高数据库的容灾能力,可以使用分库分表,读写分离的策略。
-
5. 搭建Redis集群,提高Redis的容灾性。
缓存击穿(失效)
原因
高并发流量,访问的这个数据是热点数据,请求的数据在 DB 中存在,但是 Redis 存的那一份已经过期,后端需要从 DB 从加载数据并写到 Redis。
解决方案
-
1. 对于热点数据,我们不设置过期时间,这样就可以把请求都放在缓存中处理,充分把 Redis 高吞吐量性能利用起来。或者过期时间再加一个随机值。
-
2. 预热。将热门数据提前存入Redis,并设置热门数据的过期时间超大只。
-
3. 使用锁。
缓存穿透
原因
-
• 意味着有特殊请求在查询一个不存在的数据,即数据不存在 Redis 也不存在于数据库。
-
• 导致每次请求都会穿透到数据库,缓存成了摆设,对数据库产生很大压力从而影响正常服务。
解决方案
-
• 缓存空值:当请求的数据不存在 Redis 也不存在数据库的时候,设置一个缺省值(比如:None)。当后续再次进行查询则直接返回空值或者缺省值。
-
• 布隆过滤器:在数据写入数据库的同时将这个 ID 同步到到布隆过滤器中,当请求的 id 不存在布隆过滤器中则说明该请求查询的数据一定没有在数据库中保存,就不要去数据库查询了。
缓存降级
-
• 缓存降级是指缓存失效或者缓存服务器挂掉的情况下,不去访问数据库,直接返回默认数据或者访问服务的内存数据。
-
• 如双十一时淘宝无法修改地址,是为了保证订单正常提交和付款,不允许地址修改能降低服务器压力。
-
• 降级一般是有损操作,所以尽量减少降级对业务的影响程度。
原文始发于微信公众号(ProgrammerHe):Redis笔记(四)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/207938.html