redisのHyperLog実戦
2262 ワード
シーケンス
本文は主にredisのHyperLogの使用場を研究する
関連コマンド
pfadd
1つの要素を追加するごとの複雑さはO(1)である.
127.0.0.1:6379> pfadd uv0907 uid1 uid2 uid3
(integer) 1
pfcount
作用域が単一のHyperLogの場合,複雑度はO(1),複数のHyperLogの場合,複雑度はO(N)である.
127.0.0.1:6379> pfcount uv0907
(integer) 3
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は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);
}