一. Redis的三大问题
名称 | 问题 | 解决方法 |
---|---|---|
缓存穿透 | 查询了一个不存在的数据 | 布隆过滤器 |
缓存击穿 | 某个key的缓存失效 | 互斥锁 |
缓存雪崩 | 多个Key的缓存同时失效 | 失效时间+随机时间 |
二. 布隆过滤器的原理
底层是一个bit二进制向量或叫 bit 数组,bit 里存放的数据非0即1。
通过散列函数将元素映射到bit的相应位置,并将此位置置为1。如hash(元素) = 2:
当要查询某个元素是否存在时,先通过散列函数将元素进行映射,得到在bit的位置,再判断bit的此位置是0或1,若为0,则此元素一定不存在,若为1,则此元素不一定真的存在(是否还记得大明湖畔的经典名句:hash值相等,不一定是同一个对象;同一个对象,hash值一定相等
)。
三. 布隆过滤器的缺点
-
真假难辨
确缺点 | 解释 | 解决 |
---|---|---|
误判 | 得到某个元素在bit的位置后,判断时发现此位置是1,但其实此元素并不存在 | 单独存储可能会误判的元素 |
错删 | 两个或以上的元素映射到bit的位置相同,要删除某个时,将1置为0,导致其他元素也完蛋了 | Counting Bloom Filter |