服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - Redis中HyperLogLog的使用详情

Redis中HyperLogLog的使用详情

2022-11-23 14:59_灯火阑珊处 Redis

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

添加元素

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

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

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

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

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

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

然后再对 result 做 pfcount 操作

?
1
2
> pfcount result
8

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

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

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

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

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

下面是使用的 Demo

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7114915981671006221

延伸 · 阅读

精彩推荐
  • RedisRedis整合Spring结合使用缓存实例

    Redis整合Spring结合使用缓存实例

    这篇文章主要介绍了Redis整合Spring结合使用缓存实例,介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的方法切入到有需要进入缓存的类或方...

    林炳文Evankaka5522019-10-27
  • Redis设置Redis最大占用内存的实现

    设置Redis最大占用内存的实现

    本文主要介绍了设置Redis最大占用内存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    R先生专栏5562022-10-18
  • Redis聊一聊Redis与MySQL双写一致性如何保证

    聊一聊Redis与MySQL双写一致性如何保证

    一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。本文给大家分享Redis与MySQL双写一致性该如何保证,感兴趣的朋友一...

    mind_programmonkey6512021-08-12
  • Redis面试不用愁!5分钟完全掌握Redis

    面试不用愁!5分钟完全掌握Redis

    基于这些基础的数据结构,redis封装了自己的对象系统,包含字符串对象string、列表对象list、哈希对象hash、集合对象set、有序集合对象zset,每种对象都用...

    Python中文社区2452020-10-28
  • RedisRedis主从同步配置的方法步骤(图文)

    Redis主从同步配置的方法步骤(图文)

    这篇文章主要介绍了Redis主从同步配置的方法步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    cdtaogang6142021-07-26
  • RedisRedis源码阅读:Redis字符串SDS详解

    Redis源码阅读:Redis字符串SDS详解

    这篇文章主要介绍了Redis源码阅读:Redis字符串SDS,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    Leon02044492021-08-18
  • RedisRedis安装与使用方法小结

    Redis安装与使用方法小结

    这篇文章主要介绍了Redis安装与使用方法,结合实例形式分析了Redis数据库的下载、安装、启动、设置及相关使用操作注意事项,需要的朋友可以参考下 ...

    壁立千仞无欲则刚3312019-11-13
  • RedisRedis实现验证码发送并限制每日发送次数的示例代码

    Redis实现验证码发送并限制每日发送次数的示例代码

    本文主要介绍了Redis实现验证码发送并限制每日发送次数的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...

    得过且过的勇者y8312022-10-14