布隆过滤器在缓存系统中的实践

一. 背景

在业务开发中,在并发量很高的情况下,通常会使用缓存对系统查询性能进行优化,在缓存命中率很高的情况下,缓存的使用能够大幅提升系统查询性能。但是在缓存命中率非常低场景下,如果采用传统缓存读取模式,大部分的请求会穿透至数据库,造成数据库的巨大压力。

例如:最近上线一个“贵族”功能,由于贵族价格比较贵,拥有比较强的特权,该功能也主要面向平台头部大R用户,所以如果采用传统的缓存模式,查询一个用户的贵族信息就会大概率出现缓存无法命中去读库的情况。

有些同学可能会将“空结果”缓存至数据库,这样下次去查询该用户的结果时就会命中缓存。但是由于平台巨大的用户量,如果将所有用户的空结果进行缓存成本是非常高的。

此种场景就非常适合使用布隆过滤器去解决缓存命中率低的问题。

二. 什么是布隆过滤器

本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”

相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

2.1 实现原理

布隆过滤器是一个 bit 向量或者说 bit 数组,长这样:

如果我们要映射一个值到布隆过滤器中,我们需要使用多个不同的哈希函数生成**多个哈希值,**并对每个生成的哈希值指向的 bit 位置 1,例如针对值 “baidu” 和三个不同的哈希函数分别生成了哈希值 0、3、6,则上图转变为:

Ok,我们现在再存一个值 “tencent”,如果哈希函数返回 2、3、7 的话,图继续变为:

值得注意的是,3 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。现在我们如果想查询 “dianping” 这个值是否存在,哈希函数返回了 0、4、7三个值,结果我们发现 4 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说 “dianping” 这个值不存在。而当我们需要查询 “baidu” 这个值是否存在的话,那么哈希函数必然会返回 0、3、6,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在。

这是为什么呢?答案跟简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “taobao” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “taobao” 这个值存在。

2.2 支持删除么

传统的布隆过滤器并不支持删除操作。但是名为 Counting Bloom filter 的变种可以用来测试元素计数个数是否绝对小于某个阈值,它支持元素删除。可以参考文章 Counting Bloom Filter 的原理和实现

2.3 如何选择哈希函数个数和布隆过滤器长度

很显然,过小的布隆过滤器很快所有的 bit 位均为 1,那么查询任何值都会返回“可能存在”,起不到过滤的目的了。布隆过滤器的长度会直接影响误报率,布隆过滤器越长其误报率越小。

另外,哈希函数的个数也需要权衡,个数越多则布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低;但是如果太少的话,那我们的误报率会变高。

k 为哈希函数个数,m 为布隆过滤器长度,n 为插入的元素个数,p 为误报率

四. 布隆过滤器实现

4.1 guava

Google提供的guava包里面也提供了布隆过滤器,引入pom文件:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>18.0</version>
</dependency>

具体的实现调用的代码如下,同样可以指定具体的存储数量以及预计的误判率:

import com.google.common.base.Charsets;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;public class GuavaBloomFilter {public static void main(String[] args) {BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8),1000000,0.04);bloomFilter.put("Sam");System.out.println(bloomFilter.mightContain("Jane"));System.out.println(bloomFilter.mightContain("Sam"));}
}

由于guava的布隆过滤器是缓存在本地的,所以在分布式环境中并不能很好的使用。

4.2 redisson

Redisson利用Redis实现了Java分布式的布隆过滤器。因此,在多个JVM节点上或者是其他进程里面,Redisson可以通过同一个Key获取到布隆过滤器。

public class BloomFilterTest extends BaseTest {@Autowiredprivate RedissonClient redisson;@Testpublic void test() {RBloomFilter<Object> bloomFilter = redisson.getBloomFilter("bloomTest");bloomFilter.tryInit(5000000L,0.03);System.out.println(bloomFilter.contains("2"));bloomFilter.add("2");System.out.println(bloomFilter.contains("2"));}
}

五. 布隆过滤器在缓存系统中的实践

查询流程:

布隆过滤器维护流程:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1383145.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Redisson_布隆过滤器

应用场景 去重 诞生背景 Java应用一般通过JDK自身提供的HashSet去重&#xff0c;通过contains()方法判断当前元素是否存在于Set中。该方式要求在调用contains()前&#xff0c;已经将数据列表加载到内存中&#xff08;即该方法基于内存存储实现判断功能&#xff09;。 缺点: 1.满…

【布隆过滤器】

我是&#x1f31f;廖志伟&#x1f31f;&#xff0c;一名&#x1f315;Java开发工程师&#x1f315;、&#x1f4dd;Java领域优质创作者&#x1f4dd;、&#x1f389;CSDN博客专家&#x1f389;、&#x1f339;幕后大佬社区创始人&#x1f339;。拥有多年一线研发经验&#xff0…

xmind用例数据上传至禅道

xmind格式参考&#xff0c;只需要在一级子主题填写对应用例模块ID&#xff0c;其余格式随意即可生成用例并直接上传到禅道&#xff1a; 代码里需填写禅道对应登录账号及用例所属产品 import requests import json import re import hashlib import pprint import threading fr…

认识相机

认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera。类图如下所示&#xff1a; 透视投影相机&#xff08;PerspectiveCam…

【项目实践】海康威视工业相机SDK开发小白版入门教程(VS2015+OpenCV4.5.1)

本文目录 前言怎么查找资料&#xff1f;数据手册例程 项目开发VS版本与OpenCV版本选择VS配置OpenCVVS添加MVS安装目录下的头文件和库VS项目开发 编程问题记录相机数据如何转换为OpenCV的Mat类型&#xff1f;函数不能修改全局指针变量&#xff1f;OpenCV运行报错“有未经处理的异…

Azure Kinect sdk 入门,简单使用深度相机

首先要安装azure Kinect dk传感器和人体跟踪的软件 先安装传感器&#xff1a;Azure-Kinect-Sensor-SDK/usage.md at develop microsoft/Azure-Kinect-Sensor-SDK GitHub 在这个网址里下载&#xff0c; 点击红笔画出来的地方&#xff0c;下载安装&#xff0c;记住安装路径&a…

入门级数码相机

为了满足不同层次顾客的购买要求&#xff0c;小编今天给大家交上一篇家用DC完全导购。从200万像素到800万像中间&#xff0c;分别选取了几款各级别中值得推荐的DC为大家推荐。在这里先给朋友们提一下目前数码相机市场相素与价位之间的简单联系。 目前&#xff0c;200万像素的数…

【计算机视觉-从入门到精通系列】 第二章 相机模型

2.1 针孔模型 计算机视觉是一门研究如何让计算机“看”世界的学科。人要看到世界需要眼睛&#xff0c;计算机要看到世界同样也需要“眼睛”&#xff0c;计算机的“眼睛”主要就是相机。实际应用中&#xff0c;相机的种类纷繁复杂&#xff0c;包括手机和平板电脑的相机&#xff…

5分钟入门Cinemachine智能相机系统

摘要&#xff1a;相机是Unity世界的眼睛&#xff0c;一个智能相机更是能帮咱们节省大把的时间和精力。Cinemachine现在已经大量应用到各种项目中&#xff0c;如果你还没有用过Cinemachine&#xff0c;墙裂建议你来体验一下。 你好&#xff0c;我是跟着大智学Unity的萌新&#x…

立体视觉入门指南(1):坐标系与相机参数

亲爱的同学们&#xff0c;我们的世界是3D世界&#xff0c;我们的双眼能够观测三维信息&#xff0c;帮助我们感知距离&#xff0c;导航避障&#xff0c;从而翱翔于天地之间。而当今世界是智能化的世界&#xff0c;我们的科学家们探索各种机器智能技术&#xff0c;让机器能够拥有…

camera学习入门指南

等待补充。 1.背景介绍 近年来&#xff0c;随着消费电子领域市场的快速增长&#xff0c;如安防、图像等领域&#xff0c;camera市场得到了快速发展。智能手机这几年以拍照作为主打卖点&#xff0c;带动了camera&#xff08;CCM&#xff09;出货。 具体可以看电子行业分析或者券…

机器视觉——入门基础(三)——相机镜头选型

目录 相机选型 分辨率、快门、帧率、色彩、靶面、接口 镜头选型 分辨率、靶面、焦距、接口、光圈畸变工作距离 常用计算示例 相机选型 分辨率、快门、帧率、色彩、靶面、接口 镜头选型 分辨率、靶面、焦距、接口、光圈畸变工作距离 常用计算示例 1. 面阵相机和镜头选型 已…

划重点!| 必须了解的工业相机入门级知识

工业相机是机器视觉系统的核心部件&#xff0c;其相关基础知识是行业内人员必须熟知的。那么分辨率、像素深度、行频、信噪比具体是指什么&#xff1f;CCD和CMOS又该如何去进行选择&#xff1f;今天我们就对这些内容进行一个简单的梳理&#xff0c;希望能够帮助大家了解更多。 …

机器视觉——入门基础(一)—— 相机篇

目录 一&#xff0c;相机就是CCD么&#xff1f; 二&#xff0c;像素。 三&#xff0c;像素直径。 四&#xff0c;CCD的大小。 五&#xff0c;快门速度。 六&#xff0c;增益。 七&#xff0c;1D相机&#xff08;线扫描相机&#xff09; 八&#xff0c;3D相机。 九&…

IP 协议的相关特性和数据链路层相关知识总结

目录 IP 协议的相关特性 一、IP协议的特性 二、 IP协议数据报格式 三、 IP协议的主要功能 1. 地址管理 动态分配 IP地址 NAT机制 NAT背景下的通信 IPV6 2. 路由控制​​​​​​​ 3.IP报文的分片与重组 数据链路层相关知识 1、以太网协议&#xff08;Ethernet&#xff09; 2.M…

掌握Python的X篇_28_python包管理工具pip命令

本篇将会介绍在实际使用python中最能节省效率的内容&#xff0c;利用第三方库拿来就用。 文章目录 1. pip命令是什么2. pip相关操作2.1 list2.2 install2.3 uninstall2.4 导出和导入2.4.1 freeze命令2.4.2 “-r” 3. 国内镜像4. Python Packges Index网站 1. pip命令是什么 p…

DiskGenius分区移动硬盘

打开DiskGenius 右键点击1T&#xff08;实际显示是900多G&#xff09;的移动硬盘&#xff0c;选择快速分区 分区个数按自己需要来选&#xff0c;卷标也按自己需要来修改&#xff0c;取消主分区的勾选框&#xff0c;因为是移动硬盘&#xff0c;不需要转操作系统&#xff0c;所以…

AUtoCAD Civil 3D-曲面-原始数据处理

Civil3D中&#xff0c;曲面是最重要的一个对象之一。曲面涉及到的知识点比较多&#xff0c;作为一个刚接触Civil3D的学习者&#xff0c;可能对于各种概念和各种概念之间的关系比较迷惑。这篇文章及梳理下曲面的一些重要的概念框架。 1、 曲面的分类 曲面可以分为四种类型&…

如何将卫星影像或者航拍影像叠加到CAD设计图上(Auto CAD版)

同步视频教程&#xff1a;卫星图像应用到AutoCAD工程设计&#xff08;套合、叠加、配准&#xff09;-Bigemap GIS Office 视频教程&#xff1a;如何选择中央子午线或者分度带 第一步 工具准备 BIGEMAP地图下载器&#xff1a;Bigemap系列产品-GIS行业基础软件kml\shp 相关教…

AutoCAD套合(叠加)卫星影像和矢量路网数据-CAD配准

BIGEMAP无偏移影像叠加配准&#xff08;Auto CAD版&#xff09; ​ 同步视频教程&#xff1a;http://www.iqiyi.com/w_19rubyfogh.html 专题地图制作视频教程&#xff1a;http://www.iqiyi.com/w_19rvlbep4l.html#vfrm16-1-1-1 下载&#xff1a;全国路网数据、全国水系矢量 …