2020 Redis实战【3】List,Set,Hash,Sorted_Set

LIST

对于redis的LIST就是一个链表 具体的链表模型见下图
在这里插入图片描述
这是一个双向链表,再KEY中存储了链表头的引用head与尾的引用tail。
对于LIST的命令其实也是可以通过命令 help @LIST来查询的。
例举几个常用的命令

栈类型与队列类型

栈与队列的类型主要是根据同向与反向操作LIST来实现的

  • RPUSH key value [value …]
  • LPUSH key value [value …]

对于这两个命令一个是从左往右存一个是从右往左存。
假如:
RPUSH key a b c 那么这时 value的存储值 为 abc;因为存第一个值为a 那么把下一个值存入a 右边就变成了ab 再存入c 就是是abc;
LPUSH key a b c 则相反是从左看开始存,那么value就变成了 cba;
这两个操作需要知道。

  • RPOP key

  • LPOP key

    对于这两个命令也是一样一个从右取一个从左取。

需要知道的是当RPUSH 对应RPOP 或者LPUSH对应LPOP时,这都属于同方向操作,那么这种操作就是什么后进先出,属于java类型中堆的操作;而RPUSH 对应LPOP 或者LPUSH对应RPOP时,属于反方向操作,这里就变成了先进先出,这就是队列了。

  • LRANGE key start stop 获取指定起始和结束的元素
    因为有反向索引的存在,那么对于获取全部LIST中元素那么用:

LRANGE key 0 -1

数组类型

数组类型就是根据元素的下标去操作元素。比如查看或者修改某个值

  • LINDEX key index 获取 key中的某个下标的值
  • LSET key index value 更新key中下标的某个值

阻塞的队列

类似于消费者一样的可以阻塞的队列模式

  • BLPOP key [key …] timeout
  • BRPOP key [key …] timeout
    从左或者从右获取数据,但是是以阻塞方式获取的。timeout为0时为永久等待不超时。

SET

对于SET相对于LIST而言,SET是无顺序,存入后并不知道值的顺序是什么,SET存的值是去重的,相同的值只有一个会被存入set中。
对于SET的操作。

  • SADD key member [member …] 为一个set 插入多个元素
  • SMEMBERS key 获取set的全部元素

交并差的计算

通常来说set的作用不限制于此,它还有对数据元素求交并差集的功能

交集

  • SINTER key [key …]
  • SINTERSTORE destination key [key …]
    这两个命令都是求set的交集,但是唯一不同的是sinter是直接将结果返回回来;而SINTERSTORE是将结果保存在destination 目标key中,若需要查看结果还需要再SMEMBERS目标key才可以知道结果

并集

  • UNION key [key …]
  • SUNIONSTORE destination key [key …]
    这两个是求并集合的操作。具体也和求交集一样

差集

  • SDIFF key [key …]
    对于差集而言,再redis中并没有给出前差与后差的概念,但是需要注意key的前后位置,通过key的前后位置就可以获得需要的前差还是后差,比如 SDIFF k1 k2 将k1放置第一个参数时就是需要获取k1中的差值,而k2仅作为参考。将k2 与k1交换则结果也会改变。主要取决于key的 先后顺序,先作为结果获取set,后作为判断参考set。

随机对象

  • SRANDMEMBER key [count]
    通过这个命令可以随机获取一个set中的元素列表,需要注意的是count的取值,当为正时取这个集合中的count个元素,当count大于set对象长度时以set对象长度为准。当count为负值时,取出的数值是有重复的,而且最大个数与count值的正值数数量相同,因为有重复所以与set的长度就没有关系了,比如-20就是取出20个有重复的set中元素。count为0时没有任何数返回。

  • SPOP key [count]
    这个与SRANDMEMBER 相比,spop是会修改set value中元素的pop出来以后value中的这个元素就不在有了。所以这个点是需要注意的。当然这时的count取值只能是正值。

HASH

对于HASH这种类型其实很好理解。redis的每一个库就好像一个Hash Map 而HASH这种格式就是 redis每一个键值对中又是一个Hash Map。总结一下就是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

命令及描述

而常用的就是get与set 在加上获取所有。

  • HDEL key field1 [field2]
    删除一个或多个哈希表字段
  • HEXISTS key field
    查看哈希表 key 中,指定的字段是否存在。
  • HGET key field
    获取存储在哈希表中指定字段的值。
  • HGETALL key
    获取在哈希表中指定 key 的所有字段和值
  • HINCRBY key field increment
    为哈希表 key 中的指定字段的整数值加上增量 increment 。
  • HINCRBYFLOAT key field increment
    为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
  • HKEYS key
    获取所有哈希表中的字段
  • HLEN key
    获取哈希表中字段的数量
  • HMGET key field1 [field2]
    获取所有给定字段的值
  • HMSET key field1 value1 [field2 value2 ]
    同时将多个 field-value (域-值)对设置到哈希表 key 中。
  • HSET key field value
    将哈希表 key 中的字段 field 的值设为 value 。
  • HSETNX key field value
    只有在字段 field 不存在时,设置哈希表字段的值。
  • HVALS key
    获取哈希表中所有值。
  • HSCAN key cursor [MATCH pattern] [COUNT count]
    迭代哈希表中的键值对

Sorted_Set

Sorted_Set 是一个有序的集合与Set不同是,前者有一个分值sort而set没有,有了分值以后Sorted_Set主要作为排序集合的功能就出现了。这时需要注意的是,Sorted_Set不但有了元素值,有了下标【set只包含了这两】,还有了分值,这个分值就是Sorted_Set作为排序的唯一标准。再redis的存储中Sorted_Set的值是根据分值sort的由小到大进行排序的;而随着分值sort的变化Sorted_Set的存储顺序也是变化的。

命令及描述

  • ZADD key score1 member1 [score2 member2]
    向有序集合添加一个或多个成员,或者更新已存在成员的分数

  • ZCARD key
    获取有序集合的成员数

  • ZCOUNT key min max
    计算在有序集合中指定区间分数的成员数

  • ZINCRBY key increment member
    有序集合中对指定成员的分数加上增量 increment

  • ZLEXCOUNT key min max
    在有序集合中计算指定字典区间内成员数量

  • ZRANGE key start stop [WITHSCORES]
    通过索引区间返回有序集合指定区间内的成员

  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
    通过分数返回有序集合指定区间内的成员

  • ZRANK key member
    返回有序集合中指定成员的索引

  • ZRANGEBYLEX key min max [LIMIT offset count]
    通过字典区间返回有序集合的成员

  • ZREM key member [member …]
    移除有序集合中的一个或多个成员

  • ZREMRANGEBYLEX key min max
    移除有序集合中给定的字典区间的所有成员

  • ZREMRANGEBYRANK key start stop
    移除有序集合中给定的排名区间的所有成员

  • ZREMRANGEBYSCORE key min max
    移除有序集合中给定的分数区间的所有成员

  • ZREVRANGE key start stop [WITHSCORES]
    返回有序集中指定区间内的成员,通过索引,分数从高到低

  • ZREVRANGEBYSCORE key max min [WITHSCORES]
    返回有序集中指定分数区间内的成员,分数从高到低排序

  • ZREVRANK key member
    返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序

  • ZSCORE key member
    返回有序集中,成员的分数值

  • ZSCAN key cursor [MATCH pattern] [COUNT count]
    迭代有序集合中的元素(包括元素成员和元素分值)

首先切记,关于Sorted_Set的所有排序功能都是根据sort【参数中的min max】来进行的。与value 或者下标【参数中的start stop】 没有任何关系。
需要知道包含REV【上面蓝色部分标注】的命令是反向输出,与绿色部分是的输出结果是相反的。可以理解为一个是正序【从小到大,绿色部分】一个是倒序【从大到小,蓝色部分】

集合操作

并集

  • ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
    Sorted_Set也是可以通过这个命令做集合操作的;与SET的SUNIONSTORE功能一样但是多了很多针对于sort分值的计算处理
    • destination 目标key 做完操作后的数据存放在那个key里面
    • numkeys 有几个key参与操作计算
    • key [key …] 参与的具体key,这里的数量必须和numkeys相同。
    • WEIGHTS weight权重,再进行计算的时候对分值进行计的条件。是一个大于0的浮点数,使用的时候这weight数量也需要与前面的key数量进行一一对应。
    • AGGREGATE 计算方法,最大,最小 ,求和;当这个参数为空,默认采用的是SUM求和的方式进行计算
      例子:

ZUNIONSTORE k3 2 k1 k2 WEIGHTS 1 1.2 AGGREGATE MAX
解读 : 计算 k1 k2并集并将结果存入k3将k1的分值按照权重1 与k2的分值按照权重1.2【相当于k1的分值不变而k2的分值乘以1.2以后进行计算】,进行取最大值进行计算

交集

  • ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
    计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中,看明白并集这个交集就很简单了。参数是一样的。

存储的数据结构

为什么Sorted_Set 对于排序以及计算会这么的快,因为再底层的实现中Sorted_Set采用的是Skip List【跳跃表】的方式进行数据存储的
而对于跳跃表的知识可以查看此链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值