Redis数据类型-SortedSet

本文记录Redis学习过程中遇到的Redis数据类型-SortedSet~

Sorted-Set和Set类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Set中的每一个成员都会有一个分数与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Set中的成员必须是唯一的,但是分数却是可以重复的。

在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Set中的成员在集合中的位置是有序的。因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其他类型的数据库中是很难实现的。换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。

常用命令:

  • zadd key score1 member1 score2 member2...:将所有成员以及该成员的分数存放到Sorted-Set中。如果该元素已经存在,则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
  • zscore key member:返回指定成员的分数;
  • zcard key:获取集合中的成员数量;
  • zrem key member1 member2...:移除集合中指定的成员,可以指定多个成员;
  • zrange key start end [withscores]:获取集合中脚标为start到end的成员,[withscores]参数表明返回的成员包含其分数;
  • zrevrange key start stop [withscores]:按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素);
  • zremrangebyrank key start stop:按照排名范围删除元素;
  • zremrangebyscore key min max:按照分数范围删除元素;
  • zrangebyscore key min max [withscores] [limit offset count]:返回分数在[min,max]的分数并按照分数从低到高排序。[withscores]显示分数;[limit offset count]:offset表明从脚标为offset的元素开始返回count个成员;
  • zincrby key increment member:设置指定成员的增加的分数,返回值是更改后的分数;
  • zcount key min max:获取分数在[min, max]之间的成员;
  • zrank key member:返回成员在集合中的排名(从小到大);
  • zrevrank key member:返回成员在集合中的排名(从大到小)。

示例代码:

zadd mysort 88 oliver 89 cathy
zscore mysort oliver
zcard mysort
zrange mysort 0 -1 withscores
zrevrange mysort 0 -1 withscores
zremrangebyrank mysort 0 2
zremrangebyscore mysort 0 88
zrangebyscore mysort 0 100 withscores limit 0 1
zincrby mysort 3 oliver
zcount mysort 80 90
zrank mysort oliver
zrevrank mysort oliver

常见的使用场景:

  1. 可以用于一个大型在线游戏的积分排行榜。每当玩家的分数发生变化时,可以执行zadd命令更新玩家的分数,此后再通过zrange命令获取积分top10的用户信息。当然,我们也可以利用zrank命令通过username来获取玩家的排行信息。最后我们将组合使用zrange呵zrank命令快速的获取和某个玩家积分相近的其它用户的信息;
  2. Sorted-Set类型还可用于构建索引数据。

标签: none