目录

rediszset-类型基本命令上

【redis】zset 类型:基本命令(上)

set 集合:

  1. 唯一
  2. 无序。(顺序不重要)孙行者、行者孙==>同一只猴

list

  1. 有序。(顺序很重要)孙行者、行者孙==>不同的猴

zset

  1. 有序。升序/降序

排序的规则是什么?

  • zset 中的 member 引入了一个属性——分数( score ),浮点类型

  • 每个 member 都会安排一个分数

    进行排序的时候,就是依照此处的 分数 大小,来进行升序/降序排序

https://i-blog.csdnimg.cn/img_convert/7822fdc52bddcdc624f7ce86e57568f6.png

  • 分数就是:“ 武力值

zset 中的 member 仍然要求是唯一的, score 可以重复

zset 主要还是用来存 member 的, score 只是辅助,进行排序

https://i-blog.csdnimg.cn/img_convert/d1112d94acdd0e249463d2eaecbf172a.png

使用 zadd 往有序集合中,添加元素


语法:

ZADD key [NX | XX] [GT | CH] [INCR] score member [score member ...]

ZRANGE key start end [withscores]
  • 时间复杂度:

    O ( l o g N ) O(logN)

    O

    (

    l

    o

    g

    N

    ) ,

    N N

    N 为有序集合中的元素个数

  • 添加的时候,既要添加元素,又要添加分数。 memberscore 称为是一个“ pair

    • 不要把 memberscore 理解成“键值对”( key-value pair )。键值对中,是有明确的“角色区分”,谁是键,谁是值,是明确的, 一定是根据键找到值

  • XX :只会更新已经存在的元素,不会添加新元素
  • NX :只能添加新元素,不会更新已经存在的元素
  • 都不加
    • 如果当前的 member 不存在,此时就会达到“添加新 member ”的效果
    • 如果当前 member 已经存在,此时就会更新分数

  • LTless than ):更新分数的时候,要是添加的分数比之前的分数小,此时就更新,否则就不更新
  • GTgreater than ):和 LG 相反

  • CHchanged ):针对返回值进行描述,影响到 zadd 的返回值
    • 本来 zadd 返回的是新增的元素个数
    • 加了 CH 之后,还会告诉我们修改后的元素个数

  • INCR :能够针对现有元素的分数进行运算

zset 内部实际上就是按照升序方式来排列的

https://i-blog.csdnimg.cn/img_convert/d96913603a9ce76e976925e8d7aab03a.png

  • 查询结果降序 https://i-blog.csdnimg.cn/img_convert/c5359d1372c151c8aebf34034750e670.png

https://i-blog.csdnimg.cn/img_convert/38557da38f79d6f566f47bc7a363d6ae.png

如果 修改的分数,影响到了之前的顺序 ,救护级自动移动之前的位置,保证是降序排序

获取一个 zset 的计数,即元素个数


语法:

ZCARD key
  • 返回值: zset 内的元素个数 https://i-blog.csdnimg.cn/img_convert/7d4f1fe59d78891dea78673cb551d180.png

返回分数在 minmax 之间元素的个数,默认情况下 minmax 都是包含的,可以通过 () 排除


语法:

ZCOUNT key min max
  • 时间复杂度:

    O ( l o g N ) O(logN)

    O

    (

    l

    o

    g

    N

    )

    • 先根据 min 找到对应的元素,

      l o g ( N ) log(N)

      l

      o

      g

      (

      N

      )

    • 再根据 max 找到对应的元素,

      l o g ( N ) log(N)

      l

      o

      g

      (

      N

      )

    • zset 内部,会记录每个元素当前的“ 排行 ”/“ 次序 ”,查询到元素,就直接知道了元素所在的“次序”,就可以直接把 max 对应的元素次序和 min 对应的元素次序,减法即可

  • 返回值:在区间的元素个数 https://i-blog.csdnimg.cn/img_convert/6c753046464e6fc9bc02f74cdd699909.png

  • minmax 都可以写成浮点数( zset 分数本身就是浮点数)

    • 在浮点数中,存在两个特殊的数值
      • inf :无穷大
      • -inf :负无穷大

返回指定区间⾥的元素,分数按照 升序/降序 。带上 WITHSCORES 可以把分数也返回。


语法:

ZRANGE key start stop [withscores]

ZREVRANGE key start stop [withscores]
  • 返回区间元素列表 https://i-blog.csdnimg.cn/img_convert/1ebd35dba9b70af159892c5091865014.png

删除并返回分数 最高/最低count 个元素


语法:

ZPOPMAX key [count]
  • 返回值:分数和元素列表 https://i-blog.csdnimg.cn/img_convert/dce044227fc9efb09eec452502567cf9.png

如果存在多个元素,分数相同,同时为最大值, zpopmax 删的时候,仍然只删除其中一个

这里的有序集合,也可以视为一个“ 优先级队列 ”,所以有的时候,也需要一个带有“ 阻塞功能 ”的优先级队列

每个 key 都是一个有序集合。阻塞也是在有序集合为空的时候触发阻塞,阻塞到有其他客户端插入元素

  • timeout 表示 超时时间 ,单位是秒 s

语法:

BZPOPMAX key [key ...] timeout

https://i-blog.csdnimg.cn/img_convert/fe61d5004210703e149b54b5c17315cd.png

返回指定元素的排名, 升序/降序


语法:

ZRANK key member

ZREVRANKE key member
  • 时间复杂度:

    O ( N ) O(N)

    O

    (

    N

    )

  • 排名从 0 开始 https://i-blog.csdnimg.cn/img_convert/d5468957ea153ded9f4e69933487a473.png

返回指定元素的分数


语法:

ZSCORE key member 
  • 返回值:分数 https://i-blog.csdnimg.cn/img_convert/8cf5cbab58be2d94978918a8e7419f35.png