redis有序集合类型(sorted set)

有序集合(sorted set)是在集合(set)的基础上为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能获得分数最高或最低的前N个元素、获得指定分数范围内的元素等与分数相关的操作。虽然集合中的每个元素都是不同的,但是他们的分数却可以相同。

有序集合在某些方面和列表类型有些相似

1)二者都是有序的

2)二者都可以获得某一范围的元素

但是二者也有很大的区别,这使得他们的应用场景也不相同。

1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间元素的速度会比较慢,所以它更适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。

2)有序集合类型是使用散列表和跳跃表(skip list)实现的,所以即使读取位于中间的数据速度也很快(时间复杂度是O(log(N))。

3)列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。

4)有序集合要比列表类型更耗费内存。

命令

1、增加元素

ZADD key score member [score member ...]

ZADD命令用来向有序集合中增加一个元素和该元素的分数,如果元素已经存在则会用新的分数替换原有分数,此命令返回的使新增加到集合中的元素个数。分数可以是整数也可以是浮点数,其中+inf 和-inf分表表示正无穷和负无穷。

2、获得元素的分数

ZSCORE key member

3、获得排名在某个范围的元素列表

ZRANGE    key start stop [WITHSCORES]

ZREVRANGE key start stop [WITHSCORES]

ZRANGE命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。ZRANGE命令与LRANGE命令十分相似,如索引都是从0开始,负数代表从后向前查找(-1表示最后一个元素)。如果需要同时获得元素的分数的话在ZRANGE命令尾部加上WITHSCORES参数,这时返回的数据格式就从“元素1,元素2,...,元素N”变为“元素1,分数1,元素2,分数2,...,元素N,分数N”。

ZRANGE命令的时间复杂度是O(log n + m)(其中n 为有序集合的技术,M为返回的元素个数),如果两个元素的分数相同,Redis会按照字典顺序来进行排序。

ZREVRANGE与ZRANGE唯一的不同就在于ZREVRANGE命令是按照元素分数从大到小的顺序给出结果的。

4、获取指定分数范围的元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

ZRANGEBYSCORE命令的参数虽多,但是相对好理解,此命令按照元素分数从大到小的顺序返回分数在min 和max之间(包含两端)的元素。

如果希望分数范围不好喊端点值,可以在分数前面加上“(”符号,例如如果希望返回80到100的数据,可以包含80但是不包含100,命令:ZRANGEBYSCORE key 80 (100

min 和max还支持无穷大,同ZADD一样-inf和+inf分表表示负无穷和正无穷,比如希望拿到所有高于80分的数据(不包含80分),ZRANGEBYSCORE key (80 +inf

WITHSCORES与前面的ZRANGE用法相同,LIMIT offset count 与sql的语法基本相同,即在获得的元素列表的基础上向后偏移offset个元素,并且只获得前count个元素。

5、增加某个元素的分数

ZINCRBY key increment member

ZINCRBY可以增加一个元素的分数,返回值是更改后的分数。如果increment为负数则表示减分。

6、获得集合中元素的数量

ZCARD key

7、获得指定分数范围内的元素个数

ZCOUNT key min max

ZCOUNT命令的min 和max参数的特性和ZRANGEBYSCORE命令中的一样。

8、删除一个或多个元素

ZREM key member [member ..]

此命令返回成功删除的元素的数量

9、按照排名范围删除元素

ZREMRANGEBYRANK key start stop

ZREMRANGEBYRANK命令按照元素分数从小到大的顺序删除在指定排名范围内的所有元素,并返回删除的元素个数。

10、按照分数范围删除元素

ZREMRANGEBYSCORE key min max

ZREMRANGEBYSCORE命令会删除指定分数范围内的所有元素,参数min和max特性跟ZRANGEBYSCORE命令中一样,返回值是删除的元素数量。

11、获得元素的排名

ZRANK key member

ZREVRANK key member

ZRANK命令会哦按照元素分数从小到大的顺序获得指定的元素排名(从0开始)。ZREVRANK命令则相反。

12、计算有序集合的交集

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight...]] [AGGREGATE SUM | MIN | MAX]

ZINTERSTORE命令用来计算多个有序集合的交集并将结果存储在destination键中(同样以有序集合类型存储),返回值为destination键中元素的个数。

destination键中元素的分数是由AGGREGATE参数决定的。

1)当AGGREGATE是SUM时(也就是默认),destination键中元素的分数是每个参与计算的集合中该元素分数的和。

2)当AGGREGATE是MIN时,destination键中元素的分数是每个参与计算的集合中该元素分数的最小值。

3)当AGGREGATE是MAX时,destination键中元素的分时是每个参与计算的集合中该元素分数的最大值。

ZINTERSTORE命令还能通过WEIGHTS 参数设置没每个集合的权重,每个集合在参与计算式元素的分数会被乘上该集合的权重。

另外还有一个命令与ZINTERSTORE命令用法一样,名为ZUNIONSTORE他的作用是计算集合间的并集。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容