返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Redis如何使用HyperLogLog的实现
  • 836
分享到

Redis如何使用HyperLogLog的实现

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

目录1. 概述2. 什么是基数?3. 命令3.1 PFADD3.2 PFCOUNT3.3 PFMERGE1. 概述 Redis 在 2.8.9 版本添加了 HyperLogLog 数

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. 命令

HyperLogLog 目前只支持 3 个命令,PFADD、PFCOUNT、PFMERGE。我们先来逐一介绍一下。

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的数量。

PFMERGE 命令将多个 HyperLogLog 合并为一个 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的实现的文章就介绍到这了,更多相关Redis HyperLogLog内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Redis如何使用HyperLogLog的实现

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

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

猜你喜欢
  • Redis如何使用HyperLogLog的实现
    目录1. 概述2. 什么是基数3. 命令3.1 PFADD3.2 PFCOUNT3.3 PFMERGE1. 概述 Redis 在 2.8.9 版本添加了 HyperLogLog 数据...
    99+
    2024-04-02
  • Redis怎么使用HyperLogLog实现
    这篇文章主要介绍“Redis怎么使用HyperLogLog实现”,在日常操作中,相信很多人在Redis怎么使用HyperLogLog实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis怎么使用Hype...
    99+
    2023-06-30
  • Redis中HyperLogLog数据类型如何使用
    这篇文章主要讲解了“Redis中HyperLogLog数据类型如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis中HyperLogLog数据类型如何使用”吧!1. HyperL...
    99+
    2023-07-05
  • Redis中HyperLogLog的使用详情
    目录前言添加元素前言 HyperlogLog ,基数统计; 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是 [1,2,3,4...
    99+
    2024-04-02
  • PHP中使用Redis的hyperLogLog计数器
    PHP是一种常用的服务器端编程语言,常常被用于开发Web应用程序。而Redis是一个开源的内存数据库,被广泛使用于缓存、分布式锁等场景。Redis有一个特殊的数据结构——HyperLogLog,可以进行基数估计。在某些场景下,我们需要对用户...
    99+
    2023-05-15
    PHP redis hyperloglog
  • Spark-Alchemy中HyperLogLog如何使用
    本篇文章给大家分享的是有关Spark-Alchemy中HyperLogLog如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Reaggregation的挑战Reaggre...
    99+
    2023-06-19
  • Redis的HyperLogLog算法怎么用
    这篇文章主要介绍了Redis的HyperLogLog算法怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis的HyperLogLog算法怎么用文章都会有所收获,下面我...
    99+
    2024-04-02
  • Redis高级数据类型Hyperloglog、Bitmap的使用
    目录前言Hyperloglog Hyperloglog简介Hyperloglog作用命令行中的使用SpringBoot中的使用Bitmap Bitmap简介Bitmap作用命令行...
    99+
    2024-04-02
  • Redis中 HyperLogLog数据类型使用小结
    目录1. HyperLogLog 的原理2.使用步骤:3.实现请求ip去重的浏览量使用示例4.Jedis客户端使用5.Redission使用依赖6.HyperLogLog 提供了哪些...
    99+
    2023-03-13
    Redis HyperLogLog数据类型使用 Redis HyperLogLog数据类型
  • Redis中 HyperLogLog数据类型使用小结
    目录1. HyperlogLog 的原理2.使用步骤:3.实现请求ip去重的浏览量使用示例4.Jedis客户端使用5.Redission使用依赖6.HyperLogLog 提供了哪些特性和方法7.使用场景总结:1. Hy...
    99+
    2023-03-13
    Redis HyperLogLog数据类型使用 Redis HyperLogLog数据类型
  • Redis中HyperLogLog的应用场景有哪些
    基数统计:HyperLogLog可以用于对大数据集中的唯一值进行基数统计,例如统计网站的独立访客数、独立IP数等。 网站UV统计:...
    99+
    2024-05-07
    Redis HyperLogLog
  • 如何使用Redis实现秒杀
    如何使用Redis实现秒杀?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导语:秒杀想必大家都了解,在短时间内请求访问会激增,同...
    99+
    2024-04-02
  • 如何使用redis实现持久化
    如何使用redis实现持久化?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。RDBRDB就是持久化的一种手段,把内存中数据在某些...
    99+
    2024-04-02
  • 如何使用Redis的SETNX实现锁机制
    这篇文章给大家分享的是有关如何使用Redis的SETNX实现锁机制的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。setNX,是set if not exists 的缩写,也就是只...
    99+
    2024-04-02
  • 如何使用Redis实现分布式锁
    这篇文章将为大家详细讲解有关如何使用Redis实现分布式锁,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。加锁部分解锁部分主要原理是使用了 redis 的 s...
    99+
    2024-04-02
  • 使用Redis如何实现分布式锁
    这篇文章主要介绍了使用Redis如何实现分布式锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇使用Redis如何实现分布式锁文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • 如何使用redis实现消息队列
    使用redis实现消息队列的示例:redis的pubsub功能实现发布订阅模式,代码:import redisclass Task(object):def __init__(self):self.rcon = redis.StrictRed...
    99+
    2024-04-02
  • 如何使用Redis实现秒杀功能
    这篇文章主要介绍如何使用Redis实现秒杀功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 怎样预防数据库超售现象设置数据库事务的隔离级别为Serializable(不可用)Serializable就是让数据库...
    99+
    2023-06-14
  • 如何使用Redis实现实时日志分析
    对于大型的应用开发,日志分析是非常重要的,这对于开发者来说可以帮助了解应用的运行情况,从而更好地改进应用的性能和可靠性。Redis是一个基于内存的数据存储系统,具有高效、易于使用和可扩展等特点。在本文中,我们将介绍如何使用Redis实现实时...
    99+
    2023-11-07
    redis 日志处理 实时分析
  • 如何使用redis实现分布式缓存
    本文小编为大家详细介绍“如何使用redis实现分布式缓存”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用redis实现分布式缓存”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作