Redis中HyperLogLog的使用详情

 更新时间:2022年09月23日 09:32:43   作者:_灯火阑珊处  
这篇文章主要介绍了Redis中HyperLogLog的使用详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言

HyperLogLog ,基数统计;

那什么是基数?

比如有两个数组

数组A = [1,2,3,4,5];

数组B = [3,4,5,6,7];

这时候基数就是 [1,2,3,4,5,6,7],总共有7个数;

就是去重之后的数据;

HyperLogLog 就是用来做去重复统计的;

bitmap 在做统计时,虽然使用的是 bit 来做记录,已经很节省空间了;

但是在随着数据量快速增长的情况下,bitmap 也是很占内存空间的;

而 HyperLogLog 就不同了,HyperLogLog 的每个 key 只占用 12kb 的内存,

就可以统计 2的64 次方个基数;

而且不会随着数据量的增多而变大,就是固定的 12kb

这是因为 HyperLogLog 每次只会根据添加的数据去计算基数,而不保存添加的数据本身;

但这也造成了一个问题,就是 HyperLogLog 基数统计的准确率不是100%,会有 0.81% 的误差;

但对于亿级数据的统计,这点误差似乎可以忽略不计;

同样的,bitmap 记录数据本身,它的计算是精确的;

所有,也可以说 HyperLogLog 是一种概率计算,但是误差是很小的。

这是reidis作者写的关于HyperLogLog的文章

HyperLogLog 的使用也非常简单,就3个操作api

添加元素

pfadd key value [value ...]
pfadd 20220628:uv ip1 ip2 ip3
pfadd 20220629:uv ip1 ip2 ip3 ip4 ip5
pfadd 20220630:uv ip2 ip4 ip5 ip6 ip7 ip8

重复数据不会被保存,返回的是0

> pfadd 20220628:uv ip1 ip2 ip3
1
> pfadd 20220628:uv ip1 ip2 ip3
0
  • 获取 HyperLogLog 的基数估算值
PFCOUNT key [key ...]
> pfcount 20220628:uv 20220629:uv
5

合并得出的不会被储存,使用之后就会被删掉

  • 合并多个key
pfmerge destkey key [key ...]
> pfmerge result 20220628:uv 20220629:uv 20220630:uv
OK

pfmerge 合并多个key后,会生成一条 result 数据

然后再对 result 做 pfcount 操作

> pfcount result
8

这时候拿到的值就是 上面3个key 计算出来的基数。

HyperLogLog 在 spring 里的使用也非常简单,

pfadd 对应的是 .add() 操作;

pfcount 对应的是 .size() 操作;

pfmerge 对应的是 .union() 操作;

下面是使用的 Demo

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.HyperLogLogOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@SpringBootTest
@RunWith(SpringRunner.class)
class RedisTest {
    
    @Resource
    private RedisTemplate<String, String> redisTemplate;

    @Test
    void hyperLogLogTest() {
        HyperLogLogOperations<String, String> hyperLogLogOperations = redisTemplate.opsForHyperLogLog();
        // 添加元素
        Long add = hyperLogLogOperations.add("20220628:uv", "ip1", "ip2", "ip3");
        System.out.println("add : " + add);

        hyperLogLogOperations.add("20220629:uv", "ip1", "ip2", "ip3", "ip4", "ip5");
        hyperLogLogOperations.add("20220630:uv", "ip2", "ip4", "ip5", "ip6", "ip7", "ip8");

        // 获取元素基数
        Long size = hyperLogLogOperations.size("20220628:uv", "20220629:uv");
        System.out.println("size : " + size);

        // 合并多个元素
        Long result = hyperLogLogOperations.union("unionResult", "20220628:uv", "20220629:uv", "20220630:uv");
        System.out.println("result : " + result);
        Long unionResult = hyperLogLogOperations.size("unionResult");
        System.out.println("unionResult : " + unionResult);
    }
}

到此这篇关于Redis中HyperLogLog的使用详情的文章就介绍到这了,更多相关RedisH yperLogLog内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在CenOS系统下安装和配置Redis数据库的教程

    在CenOS系统下安装和配置Redis数据库的教程

    这篇文章主要介绍了在CenOS系统下安装和配置Redis数据库的教程,Redis是一个可基于内存的高性能NoSQL数据库,需要的朋友可以参考下
    2015-11-11
  • Redis整合Lua脚本的实现操作

    Redis整合Lua脚本的实现操作

    Redis对lua脚本的支持是从Redis2.6.0版本开始引入的,它可以让用户在Redis服务器内置的Lua解释器中执行指定的lua脚本,本文就来介绍一下Redis整合Lua脚本的实现,感兴趣的可以了解一下
    2024-03-03
  • 基于redis实现token验证用户是否登陆

    基于redis实现token验证用户是否登陆

    这篇文章主要为大家详细介绍了基于redis实现token验证用户是否登陆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 在Redis中如何保存时间序列数据详解

    在Redis中如何保存时间序列数据详解

    与发生时间相关的一组数据,就是时间序列数据,这些数据的特点是没有严格的关系模型,记录的信息可以表示成键和值的关系,这篇文章主要给大家介绍了关于在Redis中如何保存时间序列数据的相关资料,需要的朋友可以参考下
    2021-10-10
  • redis启动和退出命令行简单操作步骤

    redis启动和退出命令行简单操作步骤

    Redis是一种键值存储数据库,用户可以使用它来存储和检索大量的键值数据,下面这篇文章主要给大家介绍了关于redis启动和退出命令行的相关资料,需要的朋友可以参考下
    2024-03-03
  • Redis内存满了的几种原因和最佳解决方案

    Redis内存满了的几种原因和最佳解决方案

    Redis是一款高性能的内存数据库,被广泛应用于缓存、消息队列、计数器等场景,然而,由于Redis是基于内存的数据库,当数据量过大或者配置不合理时,就有可能导致Redis的内存满,本文将介绍Redis内存满的几种原因,并提供相应的解决方案,需要的朋友可以参考下
    2023-11-11
  • 如何查看redis服务的版本

    如何查看redis服务的版本

    这篇文章主要介绍了如何查看redis服务的版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Redis中Scan命令的基本使用教程

    Redis中Scan命令的基本使用教程

    这篇文章主要给大家介绍了关于Redis中Scan命令的基本使用教程,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • 硬核!15张图解Redis为什么这么快(推荐)

    硬核!15张图解Redis为什么这么快(推荐)

    作为一名服务端工程师,工作中你肯定和 Redis 打过交道。Redis为什么快,这点想必你也知道,至少为了面试也做过准备,今天通过本文给大家介绍下,感兴趣的朋友一起看看吧
    2020-10-10
  • Redis为什么默认有16个数据库问题

    Redis为什么默认有16个数据库问题

    这篇文章主要介绍了Redis为什么默认有16个数据库问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论