参考:
https://www.cnblogs.com/happydreamzjl/p/11834277.html
缓存穿透、雪崩等解决方案
布隆过滤器:数据结构与算法之美第45课
布隆过滤器在redis中主要用来解决缓存穿透的问题:
一般情况下,先查询缓存是否有该条数据,缓存中没有时,再查询数据库。当数据库也不存在该条数据时,每次查询都要访问数据库,这就是缓存穿透。缓存穿透带来的问题是,当有大量请求查询数据库不存在的数据时,就会给数据库带来压力,甚至会拖垮数据库。
可以使用布隆过滤器解决缓存穿透的问题,把已存在数据的key存在布隆过滤器中。当有新的请求时,先到布隆过滤器中查询是否存在,如果不存在该条数据直接返回;如果存在该条数据再查询缓存查询数据库。
对于每个key,如果只使用一个hash函数,则布隆过滤器中的冲突的概率较大,从而导致误判的概率较大,我们可以使用N个hash函数。对于一个存在的key,分别用这N个hash函数求hash值,然后设置布隆过滤器中对应的bit位。 这样当一个新的请求到来时,我们要判断这个key是否在缓存中,那就先对这个key求N个hash,如果布隆过滤器中对应的N个bit位的值都位1,我们就认为这个key存在于缓存中,这时就可以去接着访问后面的缓存了,这时会有一定的误判概率,但是这个概率比只使用一个hash时小多了。 如果这N个bit有一个不为1,那么这个key就一定不存在缓存中,这时就可以直接返回了。不存在的情况不会产生误判。