redis缓存问题及解决方案

最近在学习redis的时候,看到许多相关问题和解决方案,下面记录了项目日常比较常见的问题,及我理解后的解决方案。

1、缓存穿透

问题描述:

    缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决方案:

   (1)布隆过滤器。这是目前最常见的解决方法,其原理是将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层数据库的查询压力。

   (2)如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。这种方法只适合一种场景:所请求的不存在数据比较集中,也就是说,a数据不存在但请求了,并且以后还会多次请求a,适合这种方法;但是如果遇到恶意使请求访问若干个不同的不存在数据,每个数据以后较小概率被再次请求,就坚决不能用这种方法。

2、缓存雪崩

问题描述:

   如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

解决方案:

   缓存失效时的雪崩效应对底层系统的冲击非常可怕。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线 程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。这里分享一个简单方案就时讲缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

3、缓存击穿

问题描述:https://www.jianshu.com/p/55e245bad12a

解决方案:https://www.jianshu.com/p/55e245bad12a

4、缓存与数据库一致性问题

问题描述:https://blog.csdn.net/hjm4702192/article/details/80518922

解决方案:https://blog.csdn.net/hjm4702192/article/details/80518922

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章