redisのHyperLog実戦

2262 ワード

シーケンス


本文は主にredisのHyperLogの使用場を研究する

関連コマンド


pfadd


1つの要素を追加するごとの複雑さはO(1)である.
127.0.0.1:6379> pfadd uv0907 uid1 uid2 uid3
(integer) 1
  • HyperLogに要素を追加し、内部に変動がある場合は1を返し、0
  • を返しません.

    pfcount


    作用域が単一のHyperLogの場合,複雑度はO(1),複数のHyperLogの場合,複雑度はO(N)である.
    127.0.0.1:6379> pfcount uv0907
    (integer) 3
  • は、このHyperLogの近似基数を返し、複数のHyperLogを指定する場合は、それらの並列セットの近似基数
  • を返す.

    pfmerge


    複雑度O(N)、Nは合併後のHyperLog数
    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
  • 指定されたHyperLogを新しいHyperLogLogにマージ
  • シーンの操作


    HyperLogはProbabilistic data Structuresの一種で、このようなデータ構造の基本的な考え方は統計確率上のアルゴリズムを使用して、データの正確性を犠牲にしてメモリの占有空間を節約し、関連操作の性能を向上させることである.最も典型的な使用シーンは、統計サイトの毎日のUVです.例は次のとおりです.
        @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
  • hyperlogjava版
  • を使用