简单介绍Redis中HyperLogLog的使用详情

admin1个月前笔记41
前言

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 RedisTemplateredisTemplate;
 
    @Test
    void hyperLogLogTest() {
        HyperLogLogOperationshyperLogLogOperations = 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的使用详情的文章就介绍到这了


相关文章

DNS 原理入门

DNS 原理入门

一、DNS 是什么?DNS (Domain Name System 的缩写)的作用非常简单,就是根据域名查出IP地址。你可以把它想象成一本巨大的电话本。举例来说,如果你要访问域名math.stacke...

带你领略VIM的高级操作

带你领略VIM的高级操作

1. 准备工作首先,我们打开 VIM,输入一段文本,用于今天的演示:this is a test2. 查找替换按几下 ESC 进入 Normal 模式,输入以下命令::%...

HTTP HSTS协议和 nginx

HTTP HSTS协议和 nginx

什么是HSTSHTTPS(SSL和TLS)确保用户和网站通讯过程中安全,使攻击者难于拦截、修改和假冒。当用户手动输入域名或http://链接,该网站的第一个请求是未加密的,使用普通的http。最安全的...

消息队列 MQ 入门

消息队列 MQ 入门

MQ 的概念MQ 全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器。用于分布式系统之间进行通信。MQ 的优势解耦系统的耦合性越高,容错性就越低,可维护性就越低。使用 M...

2023最新V2Ray搭建图文教程,V2Ray一键搭建脚本

2023最新V2Ray搭建图文教程,V2Ray一键搭建脚本

V2Ray 搭建教程一键搭建 V2Ray,小白福利一条命令搞定 V2Ray 搭建,最详细的 V2Ray 图文教程!前言此教程面向小白萌新,从创建 VPS 到使用 SSH 登录并安装和配置 V2Ray,...

Linux iptables防火墙原理与常用配置

Linux iptables防火墙原理与常用配置

Linux系统中,防火墙(Firewall),网址转换(NAT),数据包(package)记录,流量统计,这些功能是由Netfilter子系统所提供的,而iptables是控制Netfilter的工具...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。