前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis的HyperLogLog实战

redis的HyperLogLog实战

作者头像
code4it
发布2018-09-17 17:28:55
1.2K0
发布2018-09-17 17:28:55
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下redis的HyperLogLog的用场

相关命令

pfadd

每添加一个元素的复杂度为O(1)

代码语言:javascript
复制
127.0.0.1:6379> pfadd uv0907 uid1 uid2 uid3
(integer) 1
  • 添加元素到HyperLogLog中,如果内部有变动返回1,没有返回0

pfcount

作用域单个HyperLogLog时,复杂度为O(1),作用于多个HyperLogLog时,复杂度为O(N)

代码语言:javascript
复制
127.0.0.1:6379> pfcount uv0907
(integer) 3
  • 返回该HyperLogLog的近似基数,如果是指定多个HyperLogLog则返回的是他们的并集的近似基数

pfmerge

复杂度为O(N),N为合并后的HyperLogLog数量

代码语言:javascript
复制
127.0.0.1:6379> pfadd uv0906 uid1 uid4 uid5
(integer) 1
127.0.0.1:6379> pfmerge uv0607 uv0906 uv0907
OK
127.0.0.1:6379> pfcount uv0607
(integer) 5
  • 合并指定的HyperLogLog到新的HyperLogLog中

使用场景

HyperLogLog是Probabilistic data Structures的一种,这类数据结构的基本大的思路就是使用统计概率上的算法,牺牲数据的精准性来节省内存的占用空间及提升相关操作的性能。最典型的使用场景就是统计网站的每日UV。实例如下:

代码语言:javascript
复制
    @Test
    public void testUv(){
        String uv1 = "uv96";
        String uv2 = "uv97";
        IntStream.rangeClosed(1,100)
                .forEach(i -> {
                    System.out.println(i);
                    redisTemplate.opsForHyperLogLog()
                            .add(uv1,"user"+i);
                    redisTemplate.opsForHyperLogLog()
                            .add(uv2,"user"+i/2);
                });

        long uv1Count = redisTemplate.opsForHyperLogLog().size(uv1);
        System.out.println(uv1Count);
        long uv2Count = redisTemplate.opsForHyperLogLog().size(uv2);
        System.out.println(uv2Count);

        String uv1uv2 = "uv67";
        Long uv1uv2Count = redisTemplate.opsForHyperLogLog().union(uv1uv2,uv1,uv2);
        System.out.println(uv1uv2Count);
        Long realCount = redisTemplate.opsForHyperLogLog().size(uv1uv2);
        System.out.println(realCount);
    }

小结

  • redis的HyperLogLog特别是适合用来对海量数据进行unique统计,对内存占用有要求,而且还能够接受一定的错误率的场景。
  • 对于union操作由于是O(N),在海量数据层面需要注意慢查询问题。

doc

  • hyperloglog
  • pfadd
  • pfcount
  • pfmerge
  • HyperLogLogs in Redis
  • hyperloglog的java版使用
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 相关命令
    • pfadd
      • pfcount
        • pfmerge
        • 使用场景
        • 小结
        • doc
        相关产品与服务
        云数据库 Redis
        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档