Redis 基数 Hyperloglog 用于计不重复数量 & UV统计

Redis 2.8.9版本之后支持Hyperloglog

再次强调:Hyperloglog 用于计算不重复元素的数量,不可获取目标元素。如果需要实现类似UV统计,可以使用bit位图,bit位图,可以获取到具体某些元素!

Hyperloglog 存储基数。但什么是基数?

A {1,3,5,7,9}

B {1,3,3,5,7}

其中A就是基数,B有重复元素就不是基数。本身相当于去重

Hyperloglog在数据了很大的时候,可接受误差!一般用于网站UV,就是用户数量统计!

基数:说白了就是不重复的元素

好处

占用内存是固定的,只需要12KB内存!可存储2的64次方的元素。不管存多少个(数量在2的64次方内),占用内存都是12KB。

Hyperloglog相关命令

  • PFADD :添加一个或多个元素到某个key中 参数:key 元素…
  • PFCOUNT :获取某个key 或多个key 元素数量 参数:key…
  • PFMERGE :合并多个分支 参数:newkey oldkey1 oldkey2 …

实验:redis-cli 添加元素 查询数量 合并元素

# 添加元素 a - k 到mykey1 (一共 11 个)
pfadd mykey1 a b c d e f g h i jk


# 统计mykey1元素数量
pfcount mykey1

# 添加元素 k - n 到mykey2 (一共 4 个)
pfadd mykey2 k l m n

# 合并mykey1、mykey2为mykey3
pfmerge mykey3 mykey1 mykey2

# 输出mykey3的数量 (因为存储的是基数形式,不会重复,故 k 只计算一次)
pfcount mykey3

注意,没有删除元素

代码实现

试验1.1 添加UV记录

@Test
    public void UV统计多次添加同一个Value() {
        String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY:MM:dd"));
        Long addRes = redisTemplate.opsForHyperLogLog().add("UV统计:"+time, "张三IP","张三IP");
    }
    
    @Test
    public void UV统计多个Value() {
        String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY:MM:dd"));
        Long addRes = redisTemplate.opsForHyperLogLog().add("UV统计:"+time, "李四IP","王五IP");
    }

试验1.2 获取添加的UV的结果

@Test
    public void 获取统计结果() {
        String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY:MM:dd"));
        Long 结果数 = redisTemplate.opsForHyperLogLog().size("UV统计:"+time);
        System.out.println(结果数);
    }

试验2 合并B集合到A集合(合并后自动去重)并输出A的元素数

@Test
    public void 将目标月合并指定月并统计的结果() {
        Long res1 = redisTemplate.opsForHyperLogLog().add("UV统计:1月", "李四IP","王五IP");
        Long res2 = redisTemplate.opsForHyperLogLog().add("UV统计:2月", "王五IP","赵六IP");

        Long union1Res = redisTemplate.opsForHyperLogLog().union("UV统计:1月", "UV统计:2月");
        System.out.println(union1Res); // 输出3
    }
特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值