iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Redis中的BloomFilter简介及使用方法
  • 899
分享到

Redis中的BloomFilter简介及使用方法

2024-04-02 19:04:59 899人浏览 泡泡鱼
摘要

本篇内容主要讲解“Redis中的BloomFilter简介及使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis中的BloomFilter简介及使用

本篇内容主要讲解“Redis中的BloomFilter简介及使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis中的BloomFilter简介及使用方法”吧!

介绍以及场景使用

BloomFilter 中文名就是 布隆过滤器,作为过滤器,有没有感觉很像 LOL 中布隆的 E技能(坚不可摧) ?

布隆过滤器是一个叫 布隆 的人提出来的,它是通过一个 大型位数组和几个不同的hash函数 来实现的,我们可以把布隆过滤器理解为一个 不精确的set  。我们都知道 set 可以去重,使用 set 可以帮我们判断集合中是否已经存在某些元素并且或者帮我们实现去重功能。

但是,set 提供精确的去重功能的同时也给我们带来了一个更大的问题——空间消耗。

比如这个时候我们进行网页爬虫,需要对爬过的 url 进行去重以避免爬到已经爬过的网站,如果我们使用 set 那么也就意味着我们需要将所有爬过的 url  放入集合中,假设一个 url 64字节,那么一亿个 url 意味着我们需要占用 6GB,十亿就是 60GB 左右。

  • 请注意,是内存。

比如这个时候我们要进行垃圾邮件或者垃圾短信的过滤,我们需要从数十亿个垃圾邮件列表或者垃圾电话列表中进行判断此时的邮件或者短信是否是垃圾的。如果我们此时使用  set 那么占用空间不用我多说了,也是 百GB级别 的。

上面的面试中我提到了 缓存穿透 ,用户故意请求数据库本来就不存在的(比如ID =  -1),这个时候如果不做处理那么肯定会穿透缓存去查询数据库,一个查询还好,如果几千,几万个同时进来呢?你的数据库顶得住吗?那么此时我们使用 set  进行处理,占用那么多内存空间,你觉得值得吗???或者说,还有没有更好的方法了?

上面所讲的三个典型场景,网站去重,垃圾邮件过滤,缓存穿透 ,这三个只要使用 BloomFilter 就能完美解决。

你有没有发现,上面三个场景其实对精度要求都不是很高,尤其是垃圾邮件过滤,其实偶尔收到几个垃圾邮件也无所谓的。像缓存穿透,也正好符合了  BloomFilter 的一个特性 他说有的不一定有,他说没有的肯定没有,我说你这个 ID  在数据库不存在那就真的不存在,老子把你过滤了就是这么自信,怎么,你打我???

原理探究

聊了这么久的概念和应用场景,是不是还对 BloomFilter 怎么能进行去重的还是一脸懵逼? 下面我们就聊一聊 BloomFilter  的实现原理。首先给大家放一张结构图。

Redis中的BloomFilter简介及使用方法

其中 F、G、H 是几种 无偏 Hash 函数,底下是一个 大型的位数组,当我们向 BloomFilter  添加数据的时候,它首先会将我们的数据(key)做几次hash运算(这里就是FGH),每个hash运算都会得到一个不用的位数组索引下标,此时我们就将算出的几个下标的位置的值改成1就行。如果判断元素是否存在,只要  判断所在的所有索引下标的值都是1 就行了。

其实你也发现了,在 BloomFilter 中会出现不同key所算出的下标重复了,如上图所示,这就是误差的来源( 你可以配置初始大小和错误率来控制误差  )也是他说有的不一定有,他说没有的肯定没有 这一特性的根本原因,因为如果全是0或者存在0那么肯定不存在,如果全是1也有可能是别的几个key给放进去的1。

基本使用

因为 BloomFilter 是 Redis 的扩展模块,所以需要额外下载,你可以使用 Docker  进行拉取。安装步骤我不做详细解释,你可以到它的GitHub上学习怎么安装

安装完之后我们就可以愉快的使用啦。

  • bf.add key element 添加

  • bf.exists key element 判断是否存在

  • bf.madd key element1 element2 ... 批量添加

  • bf.mexists key element1 element2 ... 批量判断

命令很简单,你可以自己去尝试。

HyperLogLog

介绍以及场景使用

在 Redis 中还有一个会存在误差的数据结构 HyperLogLog。

我们首先思考一个场景,当老板让我们计算页面的 UV 我们该怎么办?

如果访问量不大使用 set 进行用户去重完全可以,但是访问量如果有几百万,几千万,那么就会又遇到上面提到的 浪费空间 的问题。如果我们这个时候有一个能  进行去重且能进行计数的数据结构就好了。

这个时候 HyperLogLog 就闪亮登场了!它能提供不精确的去重计数方案(误差值在 0.81% 左右),不精确就不精确哇,UV  要你多精确?0.81%我们也能接受。最重要的是 HyperLogLog 只占用 12KB 的内存。

使用方法和场景实践

  • pfadd key element 添加

  • pfcount key 计算

  • pfmerge desTKEy sourcekey1 sourcekey2 ... 合并

命令都是 pf 开头是因为这是一个名叫 Philippe Flajolet 的教授发明的。

可以看到就这三个基本命令,很简单很容易掌握。那我们来动手实践一下吧。

Redis中的BloomFilter简介及使用方法

BitMap

介绍和使用场景

首先我们再来思考一个比较有意思的场景,老板想让你统计一年内多个用户之间他们同时在线的天数,这个时候你怎么办?

你可能会想到使用 hash 存储,这太浪费空间了,有没有更好的办法呢?答案是有的,Redis 中使用了 bitmap位图。

Redis中的BloomFilter简介及使用方法

我们知道,字符串中一个字符是使用8个比特来表示的(如上图),在 Redis 中 bitmap 底层就是 string,也可以说 string 底层就是  bitmap。

如果有了这个我们是不是可以用来计算一个用户在指定时间内签到的次数?也就是一个位置代表一天,0代表未签到,1代表签到,在上图中,该用户在八天内签到了四次。

Redis 中的 bitmap 还提供了多个 bitmap 进行与,或,异或运算的命令,当然还有单个 bitmap 的 非  运算。这是不是给你提供了一点思路对于我们一开始的需求呢?

基本命令使用

  • setbit key index 0/1 设置某位的值

  • getbit key index 获取某位的值

  • bitcount key start end 获取指定范围内为1的数量

需要注意的是,这里的start 和 end是指的字符位置不是比特位置!!!包括下面的 bitpos 也是

  • bitpos key bit start end 获取第一个值为bit的从start到end字符索引范围的位置

  • bitop and/or/xor/not destkey key1 key2 对多个 bitmap 进行逻辑运算。

对于bitmap还有一个好玩的指令就是 bitfield ,这里我不做过多介绍,感兴趣的同学自己可以了解一下。

动手实践

我们首先来实现一下统计用户签到次数的功能。

Redis中的BloomFilter简介及使用方法

还记得我们一开始的问题吗?统计一年内多个用户之间他们同时在线的天数,我们有了 bitmap 还怕什么。

Redis中的BloomFilter简介及使用方法

GeoHash

介绍和场景运用

GeoHash 常用来计算 附近的人,附近的商店。

试想一下如果我们使用 关系数据库 来存储某个元素的地址 (id,经度,纬度)  。这个时候我们该如何计算附近的人?难道我们要遍历所有元素位置并做距离计算?这显然不可能。

当然你可以使用划分区域并使用 sql 语句圈出区域,然后建立 双向复合索引 来提升性能,但是数据库的并发能力毕竟有限,我们能不能使用 Redis  来做呢?

答案是可以的,Redis 中使用了 GeoHash  提供了很好的解决方案。具体原理是将地球看成一个平面,并把二维坐标映射成一维(精度损失的原因)。如果对其中的算法感兴趣你可以自己额外去了解,篇幅有限不做过多说明。

基本命令和使用实战

  • geoadd key longitude latitude element(后面可配置多个三元组) 添加元素

  • geodist key element1 element2 unit 计算两个元素的距离

  • geopos key element [element] 获取元素的位置

  • geohash key element 获取元素hash

  • georadiusbymember key element distanceValue unit count countValue ASC/DESC  [withdist] [withhash] [withcoord] 获取元素附近的元素 可附加后面选项[距离][hash][坐标]

  • georadius key longitude latitude distanceValue unit count countValue ASC/DESC  [withdist] [withhash] [withcoord] 和上面一样只是元素改成了指定坐标值 

Redis中的BloomFilter简介及使用方法

到此,相信大家对“Redis中的BloomFilter简介及使用方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Redis中的BloomFilter简介及使用方法

本文链接: https://www.lsjlt.com/news/80717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis中的BloomFilter简介及使用方法
    本篇内容主要讲解“Redis中的BloomFilter简介及使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis中的BloomFilter简介及使用...
    99+
    2024-04-02
  • Java Jwt库的简介及使用方法
    这期内容当中小编将会给大家带来有关Java Jwt库的简介及使用方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JWT介绍JWT概念JWT , 全写JSON Web Token, 是开放的行业标准RFC...
    99+
    2023-06-25
  • Python中hash加密简介及使用方法
    目录简介概念特点hash有哪些算法碰撞加盐防碰撞加密hashlib主要方法特有方法使用方法加盐crypt使用说明应用密码加密应用一致性校验简介 概念 散列算法(Hash Algori...
    99+
    2024-04-02
  • Redis在PHP应用中的BloomFilter
    Redis是一款高性能的内存数据库,广泛用于Web应用程序之中。它支持丰富的数据类型,如字符串、哈希表、列表、集合等,而且还有很多有用的特性,比如发布订阅机制、事务处理、Lua脚本等。而BloomFilter是一种经典的数据结构,用于快速判...
    99+
    2023-05-15
    PHP redis bloomfilter
  • Redis的简介及优缺点
    这篇文章主要介绍“Redis的简介及优缺点”,在日常操作中,相信很多人在Redis的简介及优缺点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis的简介及优缺点”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-16
  • redis简单介绍及安装使用小结
    一:redis介绍 Redis和Memcached类似,也属于k-v数据存储 Redis官网redis.io, 当前最新稳定版4.0.1 支持更多value类型,除了和string外,还支持hash、li...
    99+
    2024-04-02
  • vue3中hooks的简介及用法教程
    目录一、 什么是hooks二、hooks的用法补充:vue3中Hooks用法一,什么是Hooks? 二,Mixin和Hooks区别大家好,今天这篇文章是介绍一下vue3中的...
    99+
    2023-01-31
    vue3 hooks vue3 hooks用法
  • 简单介绍Python虚拟环境及使用方法
    目录一、为什么需要虚拟环境?二、virtualenv三、venv四、pipenv一、为什么需要虚拟环境? 这里的环境,指的就是 Python 代码的运行环境。它应该包含以下信息: ...
    99+
    2024-04-02
  • PHP转化函数简介及使用方法详解
    【PHP转化函数简介及使用方法详解】PHP 作为一种广泛应用于 Web 开发领域的编程语言,其中的转化函数在数据处理过程中发挥着重要作用。转化函数能够帮助开发者将不同类型的数据进行转换...
    99+
    2024-03-07
    函数 php 转化 lsp
  • Py之pycocotools库的简介、安装、使用方法及说明
    目录pycocotools库的简介pycocotools库的安装pycocotools库的使用方法1、from pycocotools.coco import COCO2、输出COC...
    99+
    2023-02-22
    pycocotools库的简介 pycocotools库安装 pycocotools库使用
  • Onnx简介以及使用
    目录 一、ONNX简介 二、使用场景 三、常见例子  四、使用步骤 1.引入库 2.读入数据 五、如何查看onnx网络结构和参数 六、一个简单例子的实现 七、ONNX 的其他基本操作 1.获取onnx模型的输出层...
    99+
    2023-09-01
    python 开发语言
  • PyTorch中torch.utils.data.DataLoader简单介绍与使用方法
    目录一、torch.utils.data.DataLoader 简介二、实例参考链接总结一、torch.utils.data.DataLoader 简介 作用:torch.utils...
    99+
    2024-04-02
  • AndroidToolbar应用栏使用方法简介
    目录一、概念二、使用2.1 xml2.2 menu2.3 Manifest2.4 Activity一、概念 默认显示的 ActionBar 来自于主题指定(Manifest中appl...
    99+
    2022-12-08
    Android Toolbar Android Toolbar应用栏
  • SpringcloudGateway简介及相关配置方法
    目录Spring Cloud Gateway 的核心功能:1、路由 Route:2、断言 Predicate:3、过滤器 filter:4、Predicate 断言条件(转发规则)介...
    99+
    2023-05-14
    Spring cloud Gateway配置 Spring cloud Gateway
  • C++中map和set的简介及使用详解
    目录关联式容器键值对setset的介绍set的使用multisetmapmap的介绍map的使用map构造map的插入map的[ ]运算符重载multiset关联式容器 关联式容器包...
    99+
    2024-04-02
  • Python中的pandas库简介及其使用教程
    目录pandas模块SeriesDateFrame常用方法处理缺失数据数据过滤绘图功能pandas模块 pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供...
    99+
    2022-11-13
    Python pandas库 Python pandas库使用 pandas库用法
  • MinIO的介绍以及简单的使用
    什么是MinIO MinIO是在GUN Affero通用公共许可证 v3.0 下发布的高性能对象存储.他与AmazonS3云存储服务API兼容.使用MinIO为机器学习,分析和应用程序数据工作负载构建高性能基础架构. MinIO是一个高...
    99+
    2023-10-26
    java Powered by 金山文档
  • Java Jwt库的简介及使用详解
    JWT介绍 JWT概念 JWT , 全写JSON Web Token, 是开放的行业标准RFC7591,用来实现端到端安全验证. 简单来说, 就是通过一些算法对加密字符串和JSON对...
    99+
    2024-04-02
  • py2exe的简介以及安装和用法
    本篇内容主要讲解“py2exe的简介以及安装和用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“py2exe的简介以及安装和用法”吧!一、简介 py2exe是一个将python脚本转换成wind...
    99+
    2023-06-17
  • spring中redis的使用方法
    这篇文章将为大家详细讲解有关spring中redis的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。spring中redis怎么用在Spring中使用RedisJ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作