Redis 详解---布隆过滤器
在面试Redis 相关的知识,总会问道缓存穿透、缓存击穿、缓存雪崩 ,首先解释下三者的含义以及区别
缓存穿透
查询数据库一定不存在的数据,那么此类的查询一般恶意的查询,缓存一不存在该类数据,大量的查询会导致数据库负荷
缓存击穿
针对某个热点数据访问量极高,某个时点热点数据缓存失效,就会导致大量的请求查询数据
缓存雪崩
某个时间点缓存集体失效
不同的问题有不同的解决方案,针对缓存穿透,普遍的解决方案是采用布隆过滤器
什么是布隆过滤器
布隆过滤器,由一串很长的二进制向量组成,可以看作二进制数组,里面存的值 0 或者 1 ,实现的原理,当向数据库添加数据时,通过多个 hash 函数,计算
出不同的值,在二进制数组中对应的未知将值置为 1 ,以此类推
如何判断数据是否存在
通过添加的hash 函数再次计算值对应的位置,判断这些位置中的值是否存在 0 (注意:这里判断不是全为1 )
如果存在至少一个0 ,则数据一定不存在于数据库
如果全部的值为 1 ,则无法判断数据是否存在
由于布隆过滤器的存储特性,当数据被删除时,无法重置对应位置的值为0(多个数据互相影响)
Redis 实现布隆过滤器 bigmaps
计算机底层存储的基础单位是字节,一个字节8位,将 “big”字符串存储,使用 ASCII 98、105、103 存储如下
在Redis ,Bitmaps 提供了一套命令来操作二进制中的位
将k1 第七位置为1 (下标从 0 开始),即第一个字符对应的码值加1
Redisssion
Redis 实现布隆过滤器底层就是通过 bitmap 数据结构,使用比较广的客户端工具 Redission
Guava 工具
google 工具包 guava 提供了布隆过滤器的实现
布隆过滤器:https://www.cnblogs.com/ysocean/p/12594982.html
布隆过滤器:https://blog.csdn.net/chenssy/article/details/110102364