Redis之缓存雪崩和缓存穿透解决方案讲解

什么是缓存雪崩?

如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。

由于原有缓存失效,新缓存味道期间所有原本应该访问缓存的请求,都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机

有什么方案来防止缓存雪崩?

1.加锁排队

mutex互斥锁解决,Redis的SETNX取set一个mutex key,当操作成功返回时,再进行loaddb的操作并回设缓存,否则就重新整个get缓存方法

2.数据预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免用户请求的时候先查数据库,再将数据缓存的问题。用户直接查询事先被预热的缓存数据

可以通过缓存reload机制,预热去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的key

3.双层缓存策略

C1为原始缓存;C2为拷贝缓存;C1失效时,可以访问C2,C1缓存失效时间设置为短期,C2设置为长期

4.定时更新缓存策略

失效性要求不高的缓存,容器初始化加载,采用定时任务更新或移除缓存

扫描二维码关注公众号,回复: 12918471 查看本文章

5.设置不同的过期时间,让缓存失效的时间尽量均匀

什么是缓存穿透?

缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候, 在缓存中找不到对应key的value,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次 无用的查询)。这样请求就绕过缓存直接查数据库

什么方案防止缓存穿透?

采用布隆过滤器BloomFilter

优势 占用内存空间很小 计算性能高

将所有可能存在的数据哈 希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

将所有key放入缓存中,每次判断是否存在

缓存空值

如果一个查询返回的数据为空(不管是数据不 存在,还是系统故障)我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113859352