缓存穿透的概念
缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
布隆过滤器
了解了缓存穿透的概念,那么我们怎么通过redis解决缓存穿透的问题呢?我们可以使用布隆过滤器
实现布隆过滤器的3种形式
1.redis布隆过滤器安装:
- redis 布隆过滤器模块github地址
https://github.com/RedisBloom/RedisBloom - linux下载RedisBloom命令
wget https://github.com/RedisBloom/RedisBloom/archive/master.zip
- 安装nuzip
yun install unzip
- 解压缩
unzip master.zip
- 拷贝扩展库
cd RedisBloom-master/
cp redisbloom.so /opt/redis5/
- 关闭redis服务,并挂载扩展库
service redis_6379 stop
ps -fe|grep redis
redis-server --loadmodule /opt/redis5/redisbloom.so
- 重新启动redis即可
布隆过滤器原理
布隆过滤器将server端已有的元素通过不同的映射函数映射成二进制位,在bitmap中对应的二进制位打1,当client访问时,如果通过相应的映射函数映射出的二进制位为0,则表示该数据即不在redis中存在也不在数据库中存在,则不需要继续访问数据库了。
布隆过滤器原理示意图
主要注意的是,布隆过滤器不能完全解决缓存穿透的问题,但是可以把这种概率大大降低(<%1),由于使用的是二进制位,所以成本很低。
布隆过滤器使用存在的问题
- 如果缓存穿透了数据在数据库中却不存在(有这种概率),那么需要client端在获取结果后自行处理,比如client在redis中添加key,value = null
- 如果数据库增加了元素,那么无比完成元素对bloom的添加