1.什么是缓存击穿?
客户端恶意访问一个不存在的数据,从而造成穿透缓存,请求直接到达数据库,频繁的发送这一类的请求,直接查询数据库,数据库的压力变大。
1.1如何解决缓存击穿呢?
1)使用布隆过滤器:
作用:判断一个数据可能存在或者一定不存在。
原理:位数组+hash函数;当一个元素加入集合后,把位数组中的一些k点,设置位1,检索时,看这些点是不是1就知道集合中有没有。只有这些点中有一个0,就是一定不存储;如果都是1则可能存在
2)redis实现布隆过滤器
(1)上传bloom过滤器到redis服务端
(2)解压:
#解压
tar -zxf RedisBloom-1.1.1.tar.gz
#进入解压文件
cd RedisBloom-1.1.1/
(3)编译
#安装gcc环境
yum install -y gcc-c++
#make命令编译当前插件
make
(4)上传到docker
(5)修改redis的核心配置文件
(6)初始化bloom过滤器:bf.reserve key x y
(7)往布隆过滤器添加元素:bf.add key value
(8)判断是否存在:bf.exists key value
2.缓存击穿
在某个热点缓存失效后,大量的请求访问该数据,在第一个请求重建缓存回来之前,大量的请求发现缓存失效,都会区尝试重建缓存,导致数据库压力增加
2.1如何解决
设置这个key为永不过期
3.缓存雪崩
大量的缓存一起失效,导致大量的请求同时到达数据库,增加了数据库的压力
3.1如何解决
再我们一开始建立缓存的时候就采用固定数+随机数的方式来打散key的过期时间
4.缓存预热
在项目开发过程中,我们根据经验去判断,哪些key的热点数据,可以提前存到缓存服务器中,这样对于高并发的情况,可以避免直接访问数据库,对数据库造成压力。