Redis 什么是缓存穿透 如何解决【面试题详解】

今天爱分享给大家带来Redis 什么是缓存穿透【面试题详解】,希望能够帮助到大家。

缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。

我们有一张数据库表,ID都是从1开始的自增整数,但是可能有黑客想把我的数据库搞垮,每次请求的ID都是负数。这会导致我的缓存就没用了,请求全部都找数据库去了,但数据库也没有这个值啊,所以每次都返回空出去。

或者恶意攻击,猜测你的key命名方式,然后估计使用一个你缓存中不会有的key进行访问。

请求的数据在缓存大量不命中,导致请求走数据库。

缓存穿透如果发生了,也可能把我们的数据库搞垮,导致整个服务瘫痪!

解决办法

1、使用互斥锁排队

根据key去获取value值,如果value为空,获取到锁,同时从数据库中加载数据,数据加载成功就释放锁,并且缓存进redis。

如果在这个过程中,有另一个线程请求这个key,会因为无法获取锁而进入等待排队,等待第一个线程释放锁。

2、接口限流与熔断、降级

重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些服务不可用时候,进行熔断,失败快速返回机制。

3、布隆过滤器

bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。

编写接口的时候,可以规范key命名,不合法的key直接过滤掉,不让这个请求到数据库层!

4、缓存空值

不管数据库中是否有数据,都在缓存中保存对应的key,值为空就行。这样是为了避免数据库中没有这个数据,导致的平凡穿透缓存对数据库进行访问。

当然空值如果太多,也会导致内存耗尽。导致不必要的内存消耗。这样就要定期的清理空值的key。避免内存被恶意占满。导致正常的功能不能缓存数据。

人已赞赏
数据库

Redis 什么是缓存雪崩,如何解决【详解】

2020-11-5 14:26:08

数据库

Redis 缓存预热是什么【详细解答】

2020-11-5 16:26:44

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
'); })();