广告位联系
返回顶部
分享到

Redis中HyperLogLog的使用介绍

Redis 来源:互联网 作者:佚名 发布时间:2022-09-26 21:02:02 人浏览
摘要

HyperLogLog,基数统计; 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是[1,2,3,4,5,6,7],总共有7个数; 就是去重之后的数据; 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);

    }

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://juejin.cn/post/7114915981671006221
相关文章
  • spring boot集成redis基础入门实例介绍
    redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储。 可以进行master-slave模式的数据备份 更多
  • redis批量操作pipeline管道操作方法

    redis批量操作pipeline管道操作方法
    redis | pipeline(管道) 背景 Redis是一种基于客户端-服务端模型以及请求/响应的TCP服务。这意味着通常情况下一个请求会遵循以下步骤: 客户
  • springboot整合使用云服务器上的Redis方法

    springboot整合使用云服务器上的Redis方法
    一、前提条件 修改redis.conf配置文件 1、protected-mode yes(默认的) 修改成 protected-mode no,解除保护模式 2、注释掉绑定ip ,绑定ip的话,使得
  • 阿里云服务器部署Redis并整合Spring Boot的介绍

    阿里云服务器部署Redis并整合Spring Boot的介绍
    一、什么是Redis redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zs
  • 生产redisson延时队列不消费问题排查解决

    生产redisson延时队列不消费问题排查解决
    问题描述 项目使用redisson延时队列功能,实现直播的开播提醒,突然有一天业务爆出问题,未触发开播提醒。 初步排查 首先通过查询生产日
  • Redis主从复制分步讲解使用

    Redis主从复制分步讲解使用
    主服务器(master)启用二进制日志 选择一个唯一的server-id 创建具有复制权限的用户 从服务器(slave)启用中继日志, 选择一个唯一的serv
  • Redis中HyperLogLog的使用介绍
    HyperLogLog,基数统计; 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是[1,2,3,4,5,6,7],总共有7个数; 就是
  • Redis中的持久化介绍

    Redis中的持久化介绍
    1. 前言 为什么要进行持久化?:持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据
  • Redis源码设计剖析之事件处理示例介绍

    Redis源码设计剖析之事件处理示例介绍
    1. Redis事件介绍 Redis服务器是一个 事件驱动程序 ,所谓事件驱动就是输入一条命令并且按下回车,然后消息被组装成 Redis 协议的格式发送给
  • Mysql应用安装后找不到my.ini文件的解决过程

    Mysql应用安装后找不到my.ini文件的解决过程
    一、背景 我在两台电脑上安装了MySQL Server 8.0,准备继续做主从配置,这时候就需要用到my.ini文件进行配置,但是我找不到my.ini文件。 我的
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计