缓存不一致、缓存雪崩、缓存击穿、缓存穿透
缓存异常一般有四种情况:缓存不一致、缓存雪崩、缓存击穿和缓存穿透,极客时间《Redis 核心技术与实战》专栏学习笔记 13,部分已经作为留言发布,但是留言太多,排在后面的一般很难被大家看到,所以集中发布在这里,欢迎讨论。
题图来自《Redis 核心技术与实战》专栏
25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?
我觉得专栏先定义了缓存数据一致性,这个是很有必要的,一种是缓存中有数据,且和数据库中一样;一种是缓存中没数据,数据库中是最新值。
在学习专栏之前,感觉只读缓存的数据一致性要好于读写缓存,而两种缓存模式如果想要保持一致性的话,都需要采用原子性的事务处理。
但是按照专栏的说法,其实是说读写缓存的同步写回策略可以保证缓存和数据库中的数据一致。
其实缓存一致性问题和其他的分布式一致性问题从本质上来看似乎是一样的。
对于课后题,只读缓存数据删改操作,如果在缓存中不是删除,而是更新,那么首先更新应该比删除慢,而且更新之后的数据其实不一定会在短时间内用得到。可能有个别的业务场景,比较适合缓存更新,但是更普遍的应该还是缓存删除。
看了课代表的答案,再次叹为天人。
26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?
缓存雪崩的概念比较形象化,容易理解。
服务降级和请求限流有点类似,但是处理方式不同,服务降级是将非核心业务暂停,而请求限流则不区分业务类型,直接限制进入系统(后端)的请求数。
缓存击穿和缓存雪崩有点类似,如果从字面上理解,雪崩是大面积的缓存失效(超期)造成的,而击穿可能是针对热点数据(超期或无法处理)。
缓存穿透的概念我之前没有想的特别清楚,在这里得到了解惑。
布隆过滤器在这里的解释比较简单,如果想要详细的说明,出门右转《数据结构与算法之美》专栏里面有详细的说明。
对于课后题,应对缓存穿透问题,服务熔断、服务降级和请求限流都可以使用,能够在一定程度上保证系统的最小可用性,但是并不能有效的解决穿透的问题。
课代表补充一种缓存穿透的场景,就是用户在新业务模块没有业务数据的情况,不过我觉的这个严格来说应该不算是缓存穿透,可能归类到缓存冷启动更合适。
其实不光是应对缓存的故障,对于大一些的分布式系统,应对各类故障可能都会考虑请求限流、服务降级和服务熔断策略。
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/3c963a3f3cbf5444b7d01dbf8】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论