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 j k


# 统计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
    }
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤