布隆过滤器原理及在推荐业务的应用
提到布隆过滤器总想起上大学时候学习的什么切比雪夫滤波器之类的东西(博主是学通信的),布隆过滤器是一种布尔型判断器,可以非常高效的判断一个物品是否在某个列表里。有人说判断一个item是否在一个item列表里,只要将所有item存在数据库,或者做一层缓存存在redis里,再遍历的查一次不就得了?这么做没问题,但是当item量巨大的时候,会出现缓存击穿等问题。布隆过滤器很好地解决了这个问题,接下来会具体介绍原理。
布隆过滤器会被应用在许多场景下,我接触比较多的就是推荐场景的应用,接下来讲下具体的业务场景和原理。
01 布隆过滤器在推荐场景下的应用
推荐系统中应用布隆过滤器主要体现以下几个场景:
场景1:判断一个用户是否是新用户
场景2:判断一个Item是否是新Item
场景3:判断一个Item是否曾经推荐给过某个User
这些场景的特点是都不需要获取具体信息,只需要知道是否存在这个信息即可。比如判断用户是否是新用户这个场景,用户进来后首先判断是否是新客,如果是新客就走冷启动推荐逻辑,如果是老客就走传统的召回+排序的推荐逻辑:
02 布隆过滤器具体原理
用过Redis都知道,Redis是将数据通过KV形式完整存储到内存里,并且提供了O(1)复杂度的查询速度。但是Redis受限于内存大小,承载不了特别大的数据。比如一个系统包含10亿个账号,每个账号占位100B,那么全写到Redis里得有快100G的内存才行,比较难达到。
布隆过滤器之所以快并且占用空间小,主要原因是布隆过滤器并不直接存储内容,存储的是哈希后的结果。比如下面这个图,假设是hash(A)的结果,
则第3个、第6个、第10个这三个等于“1”。在查询的时候只要查询这三个位置是否是1就能确定A是否存在。
但是因为哈希存在哈希冲突这样的问题,有可能第3个、第6个、第10个这三个等于“1”,但是这三个位置不是代表着A,而是B,因为A的哈希和B的哈希结果有冲突,这种概率很低。所以布隆过滤器的返回结果是一个概率值,返回的是某个对下可能存在的概率是多少。
布隆过滤器原理及在推荐业务的应用相关推荐
- 布隆过滤器原理和基于BloomFilter的误判率展示
布隆过滤器 布隆过滤器原理 布隆过滤器是由n个Hash函数和一个二进制数组组成. 如图所示(参考,hash函数可以多个) 1.保存操作 发来一个请求数据hello 对数据hello经过三次hash运算 ...
- 布隆过滤器原理深度剖析
HBase布隆过滤器原理深度剖析 1. 数据结构与原理 1.1 初始化 1.2 变量映射 1.3 变量检索 1.4 总结 2. 过滤器特性 2.1 误判率 2.2 判断特点 3. 案列代码 1970年 ...
- 布隆过滤器误判怎么办为什么会_五分钟小知识:布隆过滤器原理和应用分析
布隆过滤器出现的背景和要解决的问题 Wikipedia 上面提到布隆过滤器早在 1970 年就被提出来,很难想象在当时那个年代它的主要用途是什么,估计当时提出也是一个数据模型吧. 在互联网时代,每天会 ...
- 布隆过滤器原理和使用
LSM读放大问题背景 LSM树中读放大的来源是,我们必须寻址多个磁盘驻留表,以便完成读取操作.这是因为我们不一定能预先知道一个磁盘驻留表是否包含要搜索的键指向的数据记录. LSM使用bloomfilt ...
- 详解各种布隆过滤器原理及使用场景
文章目录 1.什么是布隆过滤器? 2.布隆过滤器的原理介绍 3.布隆过滤器使用场景 4.通过 Java 编程手动实现布隆过滤器 5.利用Google开源的 Guava中自带的布隆过滤器 6.Redis ...
- 布隆过滤器原理及实践
1 背景 现在有海量的数据,而这些数据的大小已经远远超出了服务器的内存,现在再来一条数据,如何快速高效判断这条数据在不在其中? 如果这些数据是存在数据库中的,考虑索引,分库分表:或者考虑其他目前主流的 ...
- 布隆过滤器误判_布隆过滤器原理
布隆过滤器 布隆过滤器拥有极高的性能,无论是写入操作还是读取操作,时间复杂度是O(1). 在空间上相对于其他数据结构,有很大优势, 20亿的数据需要 2000000000bit/8/1024/1024 ...
- C++ 布隆过滤器原理及实现
概念 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都 ...
- 布隆过滤器原理(有眼睛就能看懂)
作用嘛就是用来过滤非法key,避免缓存穿透(请求直接打到数据库),布隆过滤器底层用的是位数组,不仅节省空间,性能也嘎嘎猛,而且占用内存不会随着使用变大 先贴demo后BB public class M ...
最新文章
- 大数据笔记(三十二)——SparkStreaming集成Kafka与Flume
- 蓝桥杯-c++_ch04_02_修正版(java)
- java表单上下左右滚动_怎么在网页中实现表格上下左右滚动
- C++ 动态创建按钮及 按钮的消息响应
- jacoco + junit + mock 单测没有统计覆盖率问题
- 用字节流查看txt文件
- unity3d collider自动调整大小_自动网格组合建模工具Unity游戏素材资源
- [转载] Java中Scanner用法总结
- 几乎是苹果6倍!华为可穿戴设备出货量Q1同比猛增282%
- 【movable-area、movable-view】 可移动区域组件说明
- 网络工程师交换试验手册之二十一:单臂路由的配置实例
- CSS3 写的个小东西
- 开始学习:Ruby On Rails
- 2016年辽宁省电子设计大赛自动循迹小车制作心得
- PS给图片四周加上圆角
- 同学们 给你十个理由别去买iPad
- IPv6改造的重要性
- 数字逻辑 课程设计 多功能电子钟 Quartus II
- 飞机大战之一:让背景先动起来
- 百分点感知智能实验室:计算机视觉理论和应用研究
热门文章
- SNMP功能开发简介 五 使用MIB Builder创建MIB文件图文介绍
- php word组件使用方法,快速解决PHP调用Word组件DCOM权限的问题讲解
- if vue 跳出_vue使用v-if v-show 页面闪烁
- itext 添加空格_借助 iText 用代码在 PDF 中创建空白签名域
- linux nginx cdn,linux – Nginx Proxy_Pass到CDN与直接击中CDN. P...
- mysql当前时间加一天_MySQL 的加锁处理,你都了解的一清二楚了吗?
- Android中的Menu
- DynamicArray
- 哈希链表的原理及算法实现
- android如何编译lame,Android 编译 Lame 库心路历程