还不懂(缓存穿透/缓存击穿/缓存雪崩)?看这篇文就行了( 二 )


而且嘞 , 咱们是因为好多个 key 设置的过期时间都是一样的 , 所以解决方案就是 , 咱们不设置同样的时间让缓存失效了 , 咱们给一个随机时间 , 让缓存随机失效 , 这样的话 , 大规模的缓存失效情况就减少很多了
那还要一种情况呢 , 就是如果我的缓存服务器直接宕机了 , 这怎么办?也好弄 , 来个集群就解决了 , 这里只是一个解决方案 , 它的落地实现不是本文重点哈~
再谈 布隆过滤器OK, 你如果看到这里的话 , 其实这篇文章的内容就说完了
但是我感觉布隆过滤器那块 , 我没有说清楚 , 所以在这里拿出来详细说一说(我知道你一定又在默默夸阿粉是个暖男了 , 乖 , 知道就好了 , 不要真说出来 , 我会害羞的
布隆过滤器是一种数据结构 , 它是一种概率型的数据结构 , 就是它能告诉你“某样东西一定不存在或者可能存在”
你可能会说 , 这话刚刚不是说过了嘛 , 本来就挺拗口的 , 你咋还说
还不是因为这句话比较重要 , 我觉得把这句话理解透彻了 , 那么对布隆过滤器理解的应该也就到位了
来 , 为了形象生动一些 , 咱们举个例子~ 布隆过滤器是一个 bit 向量或者说 bit 数组 , 大概长这样:
还不懂(缓存穿透/缓存击穿/缓存雪崩)?看这篇文就行了文章插图
现在 , 我们需要把 “AliPay” 这个字段给存储进去 大概的存储过程就是:将要映射的值 , 使用多个不同的哈希函数生成多个哈希值 , 然后每个生成的哈希值指向的 bit 置为 1
以给的为例 , 我们现在将 “AliPay” 这个值 , 通过三个不同的哈希函数进行映射 , 那么大概就是这样了:
还不懂(缓存穿透/缓存击穿/缓存雪崩)?看这篇文就行了文章插图
同样 , 现在我要存储另外一个值 “WechatPay”, 那么可能映射之后就是下面这样:
还不懂(缓存穿透/缓存击穿/缓存雪崩)?看这篇文就行了文章插图
细心的你可能就会发现 ,4 号位置的值 , 刚开始不是给 “AliPay” 了么 , 后来 “WechatPay” 也在那里 , 这样的话 , 值不就给覆盖掉了嘛
嗯 , 没错 , 是被覆盖掉了
接下来 , 我们查询 “Ali” 那么查询之后 , 布隆过滤器可能会给你 “0 , 1 , 2” 的值 ,结果呢 “2” 的位置是 0, 说明没有任何值映射到这个位置上来 , 所以我们就可以判定数据库里面没有 “Ali” 这个值
那我查询 “AliPay” 的话 , 毫无疑问 , 肯定会返回给我 “1 , 4 , 6”, 那我们能说数据库里面一定有 “AliPay” 么?不能 , 因为 “1 , 4 , 6” 的值有可能被其他的值给覆盖到了 , 所以我们只能说 , 数据库里可能存在 “AliPay”
这就是布隆过滤器说的"某个值一定不存在或者可能存在"
【还不懂(缓存穿透/缓存击穿/缓存雪崩)?看这篇文就行了】乖 , 你懂了吗?


推荐阅读