1. 概述
Redis 在 2.8.9 版本添加了 HyperLogLog 数据结构,用来做基数统计,其优点是在输入元素的数量非常大时,计算基数所需的空间比较小并且一般比较恒定。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,并不会储存输入元素本身,所以 HyperLogLog 不能像集合那样能返回输入的各个元素。
2. 什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。基数估计就是在误差可接受的范围内,快速计算基数。
3. 命令
目前只有 PFADD、PFCOUNT 和 PFMERGE 三个命令被 HyperLogLog 支持。我们先来逐一介绍一下。
3.1 PFADD
最早可用版本:2.8.9。时间复杂度:O(1)。
PFADD 命令可以将元素(可以指定多个元素)添加到 HyperLogLog 数据结构中,存储到第一个参数 key 指定的键中。如果基数估计(评估的元素个数)发生变化,返回1,否则返回0,即在执行命令后确认基数估计是否已变化。如果指定的 key 不存在,那么就创建一个空的 HyperLogLog 数据结构(即,指定字符串长度以及编码的 Redis String)。也可以调用不指定元素参数而只指定键的命令。如果键存在,不执行任何操作并返回 0;如果键不存在,则会创建一个新的 HyperLogLog 数据结并且返回 1。实质上仅仅是生成一个新的 HyperLogLog 数据结构,而不储存任何元素。
(1) 语法格式:
PFADD key element [element ...]
(2) 返回值:
整型,如果至少有个元素被添加返回 1,否则返回 0。
(3) Example:
127.0.0.1:6379> PFADD hll a b c d e f g (integer) 1 127.0.0.1:6379> pfcount hll (integer) 7
3.2 PFCOUNT
最早可用版本:2.8.9。时间复杂度:O(1),对于多个比较大的key的时间复杂度是O(N)。
使用PFCOUNT命令可以得到一个HyperLogLog估算基数的值(也就是元素的数量)。如果键不存在,该命令返回 0,否则返回该键的基数估算值。对于多个键,返回的是多个 HyperLogLog 并集的基数估算值,通过将多个 HyperLogLog 合并为一个临时的 HyperLogLog 计算基数估算值。使用极少且一贯的内存量,HyperLogLog 可以计算集合的唯一元素数量。每个 HyperLogLog 只用 12K 加上键本身的几个字节。
(1) 语法格式:
PFCOUNT key [key ...]
(2) 返回值:
整数,返回指定 HyperLogLog 的基数估算值,如果多个 HyperLogLog 则返回并集的基数估算值。
(3) Example:
127.0.0.1:6379> PFADD hll foo bar zap (integer) 1 127.0.0.1:6379> PFADD hll zap zap zap (integer) 0 127.0.0.1:6379> PFADD hll foo bar (integer) 0 127.0.0.1:6379> PFCOUNT hll (integer) 3 127.0.0.1:6379> PFADD some-other-hll 1 2 3 (integer) 1 127.0.0.1:6379> PFCOUNT some-other-hll (integer) 3 127.0.0.1:6379> PFCOUNT hll some-other-hll (integer) 6
(4) 限制:
HyperLogLog 返回的结果并不精确,错误率大概在 0.81% 左右。
使用这个命令将会改变 HyperLogLog,并且使用 8 个字节来存储上一次计算的基数。所以,从技术角度来讲,PFCOUNT 是一个写命令。
(5) 性能问题
即使理论上处理一个密集型 HyperLogLog 需要花费较长时间,但是当只指定一个键时,PFCOUNT 命令仍然具有很高的性能。这是因为 PFCOUNT 会缓存上一次计算的基数,并且这个基数并不会一直变动,因为 PFADD 命令大多数情况下不会更新寄存器。所以才可以达到每秒上百次请求的效果。
当使用 PFCOUNT 命令处理多个键时,会对 HyperLogLog 进行合并操作,这一步非常耗时,更重要的是通过计算出来的并集的基数是不能缓存的。使用多个键时,PFCOUNT 的执行可能需要花费一些时间(通常为毫秒级),因此建议不要过度使用。
需要注意的是,该命令的单键和多键执行语义是不同的并且具有不同的性能。不建议过多使用多键执行语义。
3.3 PFMERGE
最早可用版本:2.8.9。时间复杂度:O(N),N是要合并的HyperLogLog的数量。
多个 HyperLogLog 可以通过 PFMERGE 命令合并成一个 HyperLogLog。合并后的 HyperLogLog 的基数估算值是通过对所有给定 HyperLogLog 进行并集计算得出的。计算完的结果保存到指定的键中。
语法格式:
PFMERGE destkey sourcekey [sourcekey ...]
返回值:
返回 OK。
Example:
127.0.0.1:6379> PFADD hll1 foo bar zap a (integer) 1 127.0.0.1:6379> PFADD hll2 a b c foo (integer) 1 127.0.0.1:6379> PFMERGE hll3 hll1 hll2 OK 127.0.0.1:6379> PFCOUNT hll3 (integer) 6
以上是Redis怎么使用HyperLogLog实现的详细内容。更多信息请关注PHP中文网其他相关文章!

Redis'sserver-sedierations offerfunctions andTriggersForexeCutingCompleXoperationsontheserver.1)函数函数sallowCoustomoperationsinlua,javascript,javascript,orredis'sscriptinglanguage,增强效率和维护。2)

redisisbothadatabaseandaserver.1)asadatabase,ituseSin-memorystorageforfastaccess,ifealforreal-timeapplications andCaching.2)Asaserver,ItsupportsPub/submessagingAndluAsessingandluAsessingandluascriptingftingftingftingftingftingftingftingfinteral-timecommunicationandserverserverserverserverserverserverserver-soperations。

Redis是NoSQL数据库,提供高性能和灵活性。1)通过键值对存储数据,适合处理大规模数据和高并发。2)内存存储和单线程模型确保快速读写和原子性。3)使用RDB和AOF机制进行数据持久化,支持高可用性和横向扩展。

Redis是一种内存数据结构存储系统,主要用作数据库、缓存和消息代理。它的核心特点包括单线程模型、I/O多路复用、持久化机制、复制与集群功能。 Redis在实际应用中常用于缓存、会话存储和消息队列,通过选择合适的数据结构、使用管道和事务、以及进行监控和调优,可以显着提升其性能。

Redis和SQL数据库的主要区别在于:Redis是内存数据库,适用于高性能和灵活性需求;SQL数据库是关系型数据库,适用于复杂查询和数据一致性需求。具体来说,1)Redis提供高速数据访问和缓存服务,支持多种数据类型,适用于缓存和实时数据处理;2)SQL数据库通过表格结构管理数据,支持复杂查询和事务处理,适用于电商和金融系统等需要数据一致性的场景。

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

Redis与其他数据库相比,具有以下独特优势:1)速度极快,读写操作通常在微秒级别;2)支持丰富的数据结构和操作;3)灵活的使用场景,如缓存、计数器和发布订阅。选择Redis还是其他数据库需根据具体需求和场景,Redis在高性能、低延迟应用中表现出色。

Redis在数据存储和管理中扮演着关键角色,通过其多种数据结构和持久化机制成为现代应用的核心。1)Redis支持字符串、列表、集合、有序集合和哈希表等数据结构,适用于缓存和复杂业务逻辑。2)通过RDB和AOF两种持久化方式,Redis确保数据的可靠存储和快速恢复。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

记事本++7.3.1
好用且免费的代码编辑器