Redis基数

Stella981
• 阅读 242

基数-------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);
    }
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
python知道 python知道
2年前
python常用150个英文单词
需要学习资料和视频加我微信:156758039571.python蟒蛇2.downlaods下载3.install安装4.customize自定义5.path环境变量:路径6.optional可选的7.feature特性特点8.documentation文档9.associate关联10.shortcuts快捷方式11
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)
概述ConcurrentHashMap常用于并发编程,这里就从源码上来分析一下ConcurrentHashMap数据结构和底层原理。在开始之前先介绍一个算法,这个算法和Concurrent的实现是分不开的。CAS算法:CAS是英文单词CompareAndSwap的缩写,翻译过来就是比较并替换。CAS机制当中使用
Wesley13 Wesley13
2年前
JDK源代码以及200多部软件著作中出现的以连字符构造的1011个合成词
JDK源代码以及200多部软件著作中出现的以连字符构造的1011个合成词,单词后面跟的是词频。superword是一个Java实现的英文单词分析软件,主要研究英语单词音近形似转化规律、前缀后缀规律、词之间的相似性规律等等。(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgi
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
POJ2503(Babelfish)
思路:就是用一个字典树翻译单词的问题,我们用题目中给出的看不懂的那些单词建树,这样到每个单词的叶子结点中存放原来对应的单词就好。这样查询到某个单词时输出叶子结点存的就行,查不到就"en"呗。这题用hash也是可以的1include<iostream2include<cstdio3include<std
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究