缓存穿透
用户访问一些不存在的数据,redis没有,于是去mysql查询也没有,这样就发生了两次无效的查询。
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,缓存永远不会生效。这样,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户 id 获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
解决方案
布隆过滤器
设置布隆过滤器,布隆过滤器实际上就是一个数组加上几个哈希函数。
如果布隆过滤器告诉我们这个数据不存在那就一定不存在,如果他说存在,那也不一定存在。
原理是,使用多个哈希函数,把一个key值使用多个哈希函数进行运算,把相应的位置设置为1。
当我们想要请求某个数据的时候,先用这几个哈希函数映射到数组的几个位置,如果这几个位置都是1,那就是存在,否则就不存在。
使用多个哈希函数是为了避免哈希冲突,从而减少误判,哈希冲突会导致,例如A和B使用同一个哈希函数产生了哈希冲突,先把A放进缓存,然后我们想要获取B的时候发现相应位置上的标志位已经被设置了,那我们以为这个数据是存在的,但实际上这个位置是因为哈希冲突被另一个数据标志的,增加哈希函数可以降低哈希冲突的概率。
- 对空值进行缓存:即使一个查询返回的数据为空,仍然把这个空结果(null)进行缓存,同时还可以对空结果设置较短的过期时间。这种方法实现简单,维护方便,但是会额外的内存消耗。
- 采用布隆过滤器:(布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
- 进行实时监控:当发现 Redis 的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务
- 增强 id 的复杂度,避免被猜测 id 规律
- 做好数据的基础格式校验
- 加强用户权限校验
缓存击穿
redis删掉了热点数据,导致大量请求发送到mysql。
解决方案
互斥锁
这种情况下,线程的逻辑应该是这样的,
首先去查缓存,