Redis HyperLogLog 是用来做基数统计的数据结构,它的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。本文将介绍怎样通过 jedis 库操作 Redis 的HyperLogLog 数据类型。
用来将一个或多个元素添加到指定的 HyperLogLog 中,方法定义如下:
Long pfadd(String key, String... elements)
示例:
// 添加一个元素到 hyperloglog jedis.pfadd("mykey", "c++"); // 添加两个元素到 hyperloglog jedis.pfadd("mykey", "java", "php");
用来返回给定 HyperLogLog 的基数估算值,方法定义如下:
long pfcount(String... keys)
long pfcount(String key)
示例:
// 准备数据 jedis.pfadd("mykey", "java"); jedis.pfadd("mykey", "php"); jedis.pfadd("mykey", "c++"); jedis.pfadd("mykey", "java"); // 获取 mykey 的基数值 long count = jedis.pfcount("mykey"); System.out.println("count=" + count); // count=3
用来将多个 HyperLogLog 合并为一个 HyperLogLog,方法定义如下:
String pfmerge(String destkey, String... sourcekeys)
示例:
// 准备数据 jedis.pfadd("mykey1", "java"); jedis.pfadd("mykey1", "php"); jedis.pfadd("mykey1", "c++"); jedis.pfadd("mykey1", "java"); // 准备数据 jedis.pfadd("mykey2", "python"); // 将 mykey1 和 mykey2 合并,并且将结果存放到 target String val = jedis.pfmerge("target", "mykey1", "mykey2"); System.out.println("val=" + val); // val=OK // 获取 target 的基数值 long count = jedis.pfcount("target"); System.out.println("count=" + count); // count=4
统计一段文本中单词的基数。代码如下:
String context = "A Closeable is a source or destination of data that can be closed ." + "The close method is invoked to release resources that the object is holding ."; // 使用空格分割文本 String[] words = context.split("\\s+"); for(String word : words) { if(".".equals(word)) { continue; } // 将单词添加到 hyperloglog 中 jedis.pfadd("word_hyper", word); } // 获取文本中单词基数 long count = jedis.pfcount("word_hyper"); System.out.println("count=" + count); // count=23