zoukankan      html  css  js  c++  java
  • redis数据结构之无序集合(set)、有序集合(zset)、基数(HyperLogLog)

    一、redis数据结构之无序集合(set)

    redis的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据哈希分子来存储和查找数据,理论上一个集合可以存储2的32次方-1(大约42亿)个元素,因为采用哈希表结构,所以对于redis集合的插入、删除和查找的复杂度都是O(1)。在redis中集合可以对于不同的集合进行操作,如求两个或两个以上集合的差集和交集、并集等操作。
    此外需要注意如下三点:
    1、集合是无序的;
    2、集合中元素是不重复的即唯一的,插入重复的元素会失败;
    3、集合中每一个元素都是String数据结构类型。
    集合命令如下表所示:

    命令 说明 备注
    sadd key member1[member2...] 给键为key的集合增加元素 可以同时增加多个元素
    scard key 统计键为key的集合成员数
    sdiff key1 [key2] 找出两个集合的差集 如果为单个集合,则返回该集合的所有元素
    sdiffstore des key1 [key2] 先对两个集合求差集,然后将所求结果保存到集合des中
    sinter key1 [key2] 求key1和key2两个集合的交集 如果为单个集合,则返回该集合的所有元素
    sinterstore des key1 [key2] 先对两个集合求交集,然后将所求结果保存到集合des中
    sismember key member 判断member是否是键为key的集合元素 如果是返回1,否则返回0
    smembers key 返回集合中的所有元素 如果数据量很大,需要考虑迭代遍历的问题
    smove src des member 将成员member从集合src移动到集合des中
    spop key 随机弹出集合中的一个元素 需要注意其随机性,因为集合是无序的
    srandmember key [count] 随机返回集合中一个或多个元素,count为返回元素的限制,如果为负数,则先求其绝对值 count为整数,如果不填默认为1,如果大于集合元素总数,则返回全部元素
    sunion key1[key2] 求两个集合的并集 如果为单个集合,则返回该集合的所有元素
    sunionstore des key1 key2 先对两个集合求并集,然后将所求结果保存到集合des中

    示例如下所示:

    二、redis数据结构之有序集合(zset)

    有序集合和集合类似,而zset只是说明他是有序的,和无序集合的主要区别在于每一个元素除了值之外,还多了一个分数。这个分数是浮点数,在java中是用双精度来表示的,redis根据这个分数就可以对分数进行从小到大或从大到小的排序。在有序集合中元素都是唯一的,但是对于不同元素而言,它的分数可以一样。有序集合也是通过哈希结构实现的,因此添加、删除,查找的复杂度也是O(1)。
    有序集合依赖key表示它是属于哪个集合,而依赖分数进行排序,因此值和分数都是必须的。实际上不仅可以对分数进行排序,在满足一定条件下也可以对值进行排序。
    有序集合命令如下表所示:

    命令 说明 备注
    zadd key score1 value1[score2 value2] ... 向有序集合key增加一个或多个元素 如果没有存在的集合key则新建一个键为key的集合
    zcard key 获取有序集合的元素个数
    zcount key min max 根据分数返回指定的成员列表 min为最小值,max为最大值,默认包含min和max,采用数学区间表示,如果需要不包含,则在分数前面加上(,但是不支持[
    zincrby key increment member 给有序集合成员值为member的分数增加increment
    zinterstore desKey numkeys key1[key2 key3]... 求多个有序集合的交集,并将结果保存到desKey中 numKeys是一个整数,表示有多少个有序集合
    zlexcount key min max 求有序集合key成员值在min和max的范围 这里的范围为key的成员值,redis借助数据区间的表示方法,[表示包含,(表示不包含
    zrange key start stop [withscores] 按照分值的大小返回指定范围内的成员,如果输入可选withscores,则连同分数一起返回
    zrank key member 按从小到大求有序集合的排行 排名第一的为0,第二为1,以此类推...
    zrangebylex key min max [limit offset count] 根据值的大小从小到大排序,min为最小值,max为最大值,limit为可选,当redis求出范围集合后,会产生下标0到n,然后根据偏移量offset和限定返回数count,返回对应的成员
    zrangebyscore key min max [withscores] [limit offset count ] 根据分数的大小从小到大排序,min为最小值,max为最大值,limit为可选,当redis求出范围集合后,会产生下标0到n,然后根据偏移量offset和限定返回数count,返回对应的成员
    zremrangebyscore key start stop 根据分数区间进行删除
    zremrangebyrank key start stop 按照分数排行从小到大的排序删除,从0开始计算
    zremrangebylex key min max 按照值的分布进行删除
    zrevrange key start stop [withscores] 从大到小按分数进行排序 与zrange相同,只是排序从大到小
    zrevrangebyscore key max min [withscores] 从大到小按分数排序 与zrangebyscore相同,只是排序从大到小
    zrevrank key member 按照从大到小的顺序,求元素的排序 排名第一为0,第二为1,以此类推
    zscore key member 返回成员的分数值 返回成员的分数
    zunionstore desKey numKeys key1[key2 key3 ...] 求多个有序集合的并集,并将结果存储到deskey中,numKeys表示有多少个有序集合

    三、redis数据结构之基数(HyperLogLog)

    基数是一种算法,基数的作用是评估大约需要多少个存储单元去存储数据,但是基数的算法一般会存在误差(可控的误差)。基数并不存储元素,存储元素对内存空间的消耗比较大,而是给某一个有重复数据的集合评估需要的空间单元数,所以基数是不存储元素的。
    简要了解基数的常用命令即可,如下表所示:

    命令 说明 备注
    pfadd key element 添加指定元素到基数中 如果已经存在则返回为0,添加失败
    pfcount key 返回HyperLogLog的基数值
    pfmerge desKey key1[key2....] 合并多个基数,并将其结果保存到desKey中
  • 相关阅读:
    Java运行时数据区域
    线程的实现原理
    redis分布式锁的实现
    Incorrect string value: 'xF0x9Fx92x8BTi...'错误
    linux命令之less命令
    Hive数据类型和DDL操作
    Hive安装、配置和使用
    CentOS 7安装配置MySQL 5.7
    Spring+SpringMVC+MyBatis整合
    MyBatis的事物管理和缓存
  • 原文地址:https://www.cnblogs.com/jasonboren/p/13055306.html
Copyright © 2011-2022 走看看