布隆过滤器

这玩意用来干嘛呢?我说个场景:我给你推送新闻,理论上来讲每条新闻只能推送一次,那么该如何确保每条新闻只对你推送一次呢?

布隆过滤器就是用来解决此类问题的,虽然稍微有那么点不精确,但人家在空间上能节省90%以上。Redis4.0之后才提供该功能。

其特点就是:当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存在。

常用指令:

bf.add:添加元素,只能一次添加一个元素

bf.exists:查询元素是否存在

bf.madd:指令一次添加多个

bf.mexists:指令一次查询多个元素

还提供了自定义参数的布隆过滤器,需要在add之前使用bf.reserve指令显式创建。如果重复创建则bf.reserve会报错。

bf.reserve有三个参数:key,error_rate和initial_size。

error_rate错误率,其数字越低,则需要的空间越大。

initial_size参数表示预计放入的元素数量,当实际数量超出这个数值时,误判率会上升。所以要提前设置一个较大的数值避免超出导致误判率升高。如果不使用 bf.reserve,默认的error_rate是 0.01,默认的initial_size是100。

注意事项:

initial_size估值过大则会浪费存储空间,否则估值过小则会影响准确率,因此尽量在使用之前尽可能地精确估计好元素数量,还需要加上一定的冗余空间以避免实际元素可能会意外高出估计值很多。

计算公式:

①hash函数的最佳数量k = 0.7 * (l/n) # 约等于

②位数组的长度(需要的存储空间大小bit)f=0.6185^(l/n) # ^ 表示次方计算,也就是 math.pow

③当实际元素超出预计元素时,错误率会变化f=(1-0.5^t)^k # 极限近似,k 是 hash 函数的最佳数量

n预计元素的数量

发布了167 篇原创文章 · 获赞 10 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章