布隆过滤器原理及在推荐业务的应用

提到布隆过滤器总想起上大学时候学习的什么切比雪夫滤波器之类的东西(博主是学通信的),布隆过滤器是一种布尔型判断器,可以非常高效的判断一个物品是否在某个列表里。有人说判断一个item是否在一个item列表里,只要将所有item存在数据库,或者做一层缓存存在redis里,再遍历的查一次不就得了?这么做没问题,但是当item量巨大的时候,会出现缓存击穿等问题。布隆过滤器很好地解决了这个问题,接下来会具体介绍原理。

布隆过滤器会被应用在许多场景下,我接触比较多的就是推荐场景的应用,接下来讲下具体的业务场景和原理。

01 布隆过滤器在推荐场景下的应用

推荐系统中应用布隆过滤器主要体现以下几个场景:

场景1:判断一个用户是否是新用户

场景2:判断一个Item是否是新Item

场景3:判断一个Item是否曾经推荐给过某个User

这些场景的特点是都不需要获取具体信息,只需要知道是否存在这个信息即可。比如判断用户是否是新用户这个场景,用户进来后首先判断是否是新客,如果是新客就走冷启动推荐逻辑,如果是老客就走传统的召回+排序的推荐逻辑:

屏幕快照 2020-03-23 下午4.02.00.png

02 布隆过滤器具体原理

用过Redis都知道,Redis是将数据通过KV形式完整存储到内存里,并且提供了O(1)复杂度的查询速度。但是Redis受限于内存大小,承载不了特别大的数据。比如一个系统包含10亿个账号,每个账号占位100B,那么全写到Redis里得有快100G的内存才行,比较难达到。

布隆过滤器之所以快并且占用空间小,主要原因是布隆过滤器并不直接存储内容,存储的是哈希后的结果。比如下面这个图,假设是hash(A)的结果,

image.png

则第3个、第6个、第10个这三个等于“1”。在查询的时候只要查询这三个位置是否是1就能确定A是否存在。

但是因为哈希存在哈希冲突这样的问题,有可能第3个、第6个、第10个这三个等于“1”,但是这三个位置不是代表着A,而是B,因为A的哈希和B的哈希结果有冲突,这种概率很低。所以布隆过滤器的返回结果是一个概率值,返回的是某个对下可能存在的概率是多少。

猜你喜欢

转载自blog.csdn.net/gshengod/article/details/105059287