说一个很常见的场景吧,我们在新闻网站、视频网站浏览新闻视频的时候,它们是怎么给我们推荐那些我们没看过的内容的呢?
可能你会想到:服务器端储存每个用户的观看记录,在去除掉每个用户已观看的内容,但是这种方法会给服务器端很大的压力,当用户量特别大的时候,每个人看过的内容又很多的时候,效率会大大降低,甚至拖垮服务。
如果每个用户的观看内容是存到了关系型数据库,那每次查询的时候都要顺便判断是否有重复观看的数据,说实话,关系型数据库不适合这种场景。
再假如,把观看数据存到了缓存中,但是这些数据是不会消失的,会随着时间的推移而变得越来越多,时间长了缓存也一样撑不住。
这个时候就需要专业的工具去解决这种场景,我们的布隆过滤器就可以登场了!
接下来我们来详细看一下这个布隆过滤器到底是个什么东西。
布隆过滤器是什么?
我们知道在Redis中Set结构是可以用来判断集合中是否存在某一个value的,简单的理解,布隆过滤器就是一个不怎么精确的Set结构,但是有时候他又不是那么不精确,我们可以通过参数的设置,让他变得足够精确。
当布隆过滤器说一个值存在时,这个值有可能不存在;但是当它说一个值不存在时,那这个值确实不存在。
我们再来看上面我说的那个场景,是不是就可以用布隆过滤器过滤掉那些已经观看过的内容了呢,虽然可能有误判,但是也在合理接受的范围内。
布隆过滤器怎么使用?
布隆过滤器的指令其实非常少,只有添加和判断是否存在两个,bf.add
和bf.exists
。
其中bf.add
用来添加元素,bf.exists
用来判断元素是否存在,用法和Set结构的sadd
和sismember
差不多。这两个命令一次只能操作一个元素,当然还有批量操作的指令bf.madd
和bf.mexists
。
本来下面该是命令的演示了,但是时间不太充足了,今天先到这,我们明天继续!谢谢大家观看!