redis 学习 --->>> 5、五大常用数据类型 -> 6、redis 有序集合 Zset (sorted set)

6、redis 有序集合 Zset (sorted set)

1、简介

  • Redis有序集合zset与普通集合set非常相似,都是一个没有重复元素的字符串集合。
  • 不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
  • 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
  • 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

2、常用命令

  • zadd …
    • 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
  • zrevrange[WITHSCORES]**
    • 返回有序集 key 中,下标在之间的元素
    • 带WITHSCORES,可以让分数一起和值返回到结果集。
  • zrangebyscore key minmax [withscores] [limit offset count]
    • 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
    • 有序集成员按 score 值递增(从小到大)次序排列。
  • zrevrangebyscore key maxmin [withscores] [limit offset count]
    • 同上,改为从大到小排列。
  • zincrby
    • 为元素的score加上增量
  • zrem
    • 删除该集合下,指定值的元素
  • zcount
    • 统计该集合,分数区间内的元素个数
  • zrank
    • 返回该值在集合中的排名,从0开始。

3、数据结构

  1. SortedSet(zset)是Redis提供的一个非常特别的数据结构,
    1. 一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,
    2. 另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
  2. zset底层使用了两个数据结构
    1. hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
    2. 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

4、跳跃表

1、简介

有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。

Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。

2、实现

跳跃表其实就是**使用【关键节点】作为【索引】**的一种结构。

跳跃表只需要从最上层开始遍历,由于每一层的链表都是有序的,因此当查找的“键”不存在于某一层中的时候,只需要在比查找目标的“键”要大的结点向下一次跳跃即可,重复操作,直至跳跃到最底层的链表。

现在要取出一个数组中的 8 这个元素

  1. 先从顶层开始遍历,与16进行对比小,进入下一层。
  2. 第二层抽出的节点是4和16,为什么是4和16,就是查找的目标值跟上层索引比较它小,就选这个比他大的值的节点和他左边小的那一边的跳一个节点截取目标节点4,
  3. 与4进行比较,比4大,比4大,在有序链表中就继续往下落,范围就在4-16之间进入下一层。
  4. 与8进行比较,没有比8大,切换为当前结点4。
  5. 将节点4的下一个节点8和当前值进行比较,相同,取出。

请添加图片描述


版权声明:本文为m0_55668855原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。