Redis应用学习(六)布隆过滤器

介绍

但是如果我们想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供 pfcontains 这种方法。

讲个使用场景,比如我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的?

你会想到服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。问题是当用户量很大,每个用户看过的新闻又很多的情况下,这种方式,推荐系统的去重工作在性能上跟的上么?

由于关系型数据库受到并发IO的限制,所以用关系型数据库去存储用户历史数据频繁的读取是非常不利于系统性能的。
如果使用纯内存对用户历史数据进行存储在用户量很大和用户使用周期很长的情况下对内存的占用非常高,需要不断追加内存。方案不可取

因此布隆过滤器诞生解决这个问题,它是准们用来解决去重问题的同时,在空间上还能节省百分之九十以上。只是稍微有点点不精确,也就是有一定的误判概率

布隆过滤器是什么?

布隆过滤器可以理解为一个不怎么精确的set结构,当布隆过滤器说某个值存在时,这个值可不能不存在;当它说不存在时候,那就肯定不存在。

布隆过滤器能准确过滤掉那些已经看过的内容,那些没有看过的新内容,它也会过滤掉极小一部分 (误判),但是绝大多数新内容它都能准确识别。这样就可以完全保证推荐给用户的内容都是无重复的。

Redis中的布隆过滤器