1.软文推荐

2.软文推荐

3.软文推荐

这篇文章主要介绍了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 redisTemplate;

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

本文来源:www.lxlinux.net/10261.html,若引用不当,请联系修改。

相关文章 8

1

source命令具体使用方法 1分钟前

Linux系统中,source命令通常用。来代替,是一个点命令,与一般的命令有所不同,下面为大家分享一下source命令具体使用方法。 source命令的...

2

注销网站备案理由(网站撤销备案) 4分钟前

目录:1、怎么备案注销2、网站注销这一栏如何填写?3、域名怎么注销备案4、网站备案注销原因怎么写5、备案注销的流程6、网站备案为什...

3

FreeBSD 中部署FTP服务 5分钟前

基于该ftp,FTP客户端与服务端可以实现共享文件、上传文件、下载文件。 FTP 基于TCP协议生成一个虚拟的连接,主要用于控制FTP连接信息,同...

4

Linux系统安装netstat教程 7分钟前

Netstat 是一个控制台命令,它是一个非常有用的工具,用于监视 tcp/ip 网络,显示路由表、实际的网络连接以及每个网络接口设备的状态。...

5

恩施网站建设的简单介绍 8分钟前

目录:1、湖北映秀文化传播有限公司怎么样?2、恩施传媒公司靠谱吗3、来凤在线科技有限公司怎么样?4、恩施市御天文化传媒有限公司怎...

6

Linux中使用正则表达式的命令 10分钟前

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,正则表达式是繁琐的,但它是强大的,学会之后的应用会让你...

7

资阳vps(资阳疫情) 11分钟前

目录:1、求ADSL动态拨号VPS,最好是四川的...求ADSL动态拨号VPS,最好是四川的... 云立方网ADSL拨号VPS有四川德阳,眉山,自贡,资阳,南充等...

8

Linux系统/etc/passwd、/etc/shadow文件详解 13分钟前

在Linux系统中/etc/passwd 和 /etc/shadow这两个文件是非常重要的文件,所有用户的账户号和密码都可以在这两文件中找到。 linuxidc@linuxidc:~/linux...