缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
常见的两种解决方案:
1.缓存空对象
优点:实现简单,维护方便
缺点:占用较大的内存,可能会造成短期数据不一致
思路:如果数据在数据库中不存在,则返回一个空对象,并将其缓存在redis
2.布隆过滤器
优点:内存占用较少,没有多余key
缺点:实现复杂,存在误判可能
思路:
通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中,假设布隆过滤器判断这个数据不存在,则直接返回,这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突
2.1为啥会存在哈希冲突导致误判
这就得说说布隆过滤器是怎么增加和查询元素的!!!
布隆过滤器由一个固定大小的二进制向量和一系列哈希函数组成
现在有”Apple"和“Orange”两个单词存入,首先对于“Apple"单词利用三个哈希函数得到1,5,10,并将1,5,10置1
同理对“Orange”利用哈希函数计算得2,5,7,并将相应位置置1
当查询“Apple”时利用哈希函数得到三个哈希值1,5,7,这时发现三个位置均为1则表示"Apple"可能存在,但是如果这时候数据库中没有"Banana",但是哈希值为1,2,5,这时候就可能发生误判