Redis基数----HyperLogLog

原创
2018/05/23 15:32
阅读数 1.2K

基数-------HyperLogLog

  • 基数是一种算法。举个例子,一本英文著作由数百万个单词组成,你的内存却不足以存储它们,那么我们先分析一下业务。英文单词本身是有限的,在 这本书的几百万个单词中有许多重复单词,扣去重复的单词,这本书中也就是几千到一万多个单词而已,那么内存就足够存储它们了。比如数字集合{1, 2,5,7,9,,1,5,9}的基数集合为{1,2,5,7,9}那么基数(不重复元素)就是5,基数的作用是评估大约需要准备多少个存储单元去存储数据, 但是基数的算法一般会存在一定的误差(一般是可控的)。Redis对基数数据结构的支持是从版本2.8.9开始的。
  • 基数并不是存储元素,存储元素消耗内存空间比较大,而是给某一个有重复元素的数据集合(一般是很大的数据集合)评估需要的空间单元娄,所以它 没有办法进行存储,加上在工作中用得不多,所以简要介绍一下Redis的HyperLogLog命令就可以了。

Redis的HyperLogLog命令

    ---------------------------------------------------------------------------------------------------------------
    命令                                   说明                          备注
    pfadd key element               添加指定元素到HyperLogLog         如果已经存储元素,则返回为0,添加失败
    pfcount key                     返回HyperLogLog的基数值            ----------
    pfmerge desKey key1[key2 ...]   合并多个HyperLogLog,并将其保存在desKey中  ----------
    ---------------------------------------------------------------------------------------------------------------

命令行

127.0.0.1:6379> pfadd h1 a
(integer) 1
127.0.0.1:6379> pfadd h1 b
(integer) 1
127.0.0.1:6379> pfadd h1 c
(integer) 1
127.0.0.1:6379> pfadd h1 d
(integer) 1
127.0.0.1:6379> pfadd h1 a
(integer) 0
127.0.0.1:6379> pfcount h1
(integer) 4
127.0.0.1:6379> pfadd h2 a
(integer) 1
127.0.0.1:6379> pfadd h2 z
(integer) 1
127.0.0.1:6379> pfmerge h3 h1 h2
OK
127.0.0.1:6379> pfcount h3
(integer) 5
127.0.0.1:6379>

在Spring中操作基数

    @Test
    public void testHyperLogLog() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
        redisTemplate.opsForHyperLogLog().add("HyperLogLog", "a", "b", "c", "d", "a");
        redisTemplate.opsForHyperLogLog().add("HyperLogLog2", "a");
        redisTemplate.opsForHyperLogLog().add("HyperLogLog2", "z");
        Long size = redisTemplate.opsForHyperLogLog().size("HyperLogLog");
        System.err.println(size);
        size = redisTemplate.opsForHyperLogLog().size("HyperLogLog2");
        System.err.println(size);
        redisTemplate.opsForHyperLogLog().union("des_key", "HyperLogLog", "HyperLogLog2");
        size = redisTemplate.opsForHyperLogLog().size("des_key");
        System.err.println(size);
    }
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部