如何在海量数据中快速判断元素是否存在??
假设
- 利用位图标记数据是否存在,假设1为存在,0为不存在。
位图(位数组) Bieset
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
-
海量数据是不同的数据,想要都用 0和1标记,并且要占满(分布均匀)整个位图,可以采用哈希算法(散列算法)
-
由于哈希算法会出现哈希碰撞,解决哈希碰撞的方法可以有扩容、再哈希等等。。于是引出布隆
过滤器(Bloom Filter) -
网上对它的解释 :它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
-
此时我们就解决了文章开头提出的问题。
什么是缓存穿透
- 网上对它的解释 :用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
- 了解了缓存穿透后我们就能发现,起初提出的: 如何在海量数据中快速判断元素是否存在,它的答案就是解决缓存穿透的办法即 布隆过滤器(BF)。
补:BF没有删除数据的方法,带计数器的布隆过滤器(CountingBloomFilter)有一个remove方法可以删除,如图所示:
a和c两个元素都有一次哈希值在同一个位置,此时计数器会记录在这个位置标记的次数,删除时会先删除计数器中的记录数直至为0,才修改位图中的标记1为0.
(做这个测试时,快速插入大量数据可以使用JDBC - PreparedStatement - addbatch() 方法)