1.布隆过滤器底层实现
首先 redis布隆过滤器的底层是个很长的二进制向量组组成的是个bitmap的数据结构,
其实就是个String, 因为redis支持的数据结构没有bitmap
2.新增和查询的实现
是用的hash运算进行散列的,所以我们设计的时候要自己定义映射函数,他最精髓的一点就是,他可以判定某个值一定不存在,但是他判定存在的值呢不是一定存在的。
因为他在新增的过程中,底层可以简单看做是一个二进制的数组(二进制向量组)在每一次进行映射时会调用hash函数返回映射下标,将下标位置置为1这样来判断这个数据存在,那么在多次映射过程中肯定会有数据通过hash运算后得到的下标位置是一样的,所以他的缺点就来了,就是你不能够100%的确定你通过hash运算得到的这个数据位置所在二进制数组为1的情况下这个数据是否真正的存在就会造成误判。另外,他还不能够进行删除操作因为上面提到了,多次hash得到相同位置下标,当有这种情况时,比如第2号位置有存5,9这样两个数据,你现在只要删5,但是5和9的位置下标又是一样的,当你对2号位置进行置0操作时这个位置上的9这个数据也被连带删除了,以后拿数据时就会丢失9这个数据又回去访问数据库增加压力
3.布隆过滤器解决缓存穿透
解决缓存穿透的过程:
①客户端先查询缓存->没有缓存查询过滤器(有缓存直接返回)
②初始化布隆过滤器(将所有id初始化到过滤器中,也叫预热)-->
③判断客户端发来的请求是否有编号(就是映射的mysql数据在二维数组的下标)
④如果有就查询数据库并返回数据,再添加缓存
⑤有单机版guava和分布式版本redisson