Redis常用命令七:有序集合

前言:

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

应用场景:APP的排行榜(下载排行,阅读排行)、电影打分等等

0、返回有序集中,成员的分数值

ZSCORE key member
例子:zscore 键名 成员名称

1、向有序集合添加一个或多个成员,或者更新已存在成员的分数

 ZADD key score1 member1 [score2 member2]   
例子: zadd 键名 分数 成员名称

2、通过索引区间返回有序集合成指定区间内的成员(从小到大排序)(和zrevrang相反) ↓

ZRANGE key start stop [WITHSCORES] 
例子:zrange 键名 开始值0 结束值-1

3、返回有序集中指定(下标区间内)的成员,通过索引,分数从高到低排序(从大到小排序)(和zrang相反)↑

ZREVRANGE key start stop [WITHSCORES]
例子:zrevrang 键名 起始位置 结束位置
4、返回有序集中指定(分数区间内)的成员,分数从高到底(和zrevrange很像,区别在于一个是根据指定位置返回结果,一个是指定分数来返回结果)↑
例子 zrevrangebyscore 键名 指定的最大分数值 指定的最小分数值

特别注意: 分数值指定时一定是大的在前,小的在后,才会返回正确的结果

ZREVRANGEBYSCORE key max min [WITHSCORES]

5、 通过分数返回有序集合指定区间内的成员,分数从低到高(和zrevrangbyscore相反)

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
例子 zrangbyscore 键名 指定的最小分数 指定的最大分数 (LIMIT 指定个数)

6、 获取有序集合的成员数

ZCARD key
例子:ZCARD 键名

7 、计算在有序集合中指定区间分数的成员个数 (结果 最小值 <= 个数 <= 最大值)

ZCOUNT key min max 
例子 :zcount 键名 最小值 最大值
8、移除有序集合中的一个或多个成员
 ZREM key member [member ...]
例子 zrem 键名 成员一 成员二……
9、返回有序集合中指定成员排名的索引,返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,也就是说, score 值最小的成员排名为 0 。(和ZREVRANK相反)
ZRANK key member
例子:zrank 键名 成员
127.0.0.1:6379> zrange fruits 0 -1
1) "pear"
2) "apple"
3) "orange"
127.0.0.1:6379> zscore fruits pear
"8.9000000000000004"
127.0.0.1:6379> zscore fruits apple
"9.0999999999999996"
127.0.0.1:6379> zscore fruits orange
"9.3000000000000007"
127.0.0.1:6379> zrank fruits orange
(integer) 2
127.0.0.1:6379> zrank fruits pear
(integer) 0
10、有序集合中对指定成员的分数加上增量 increment

为有序集 key 的成员 memberscore 值加上增量 increment

可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 memberscore 值减去 5

key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member

key 不是有序集类型时,返回一个错误。

score 值可以是整数值或双精度浮点数。

返回值member 成员的新 score 值,以字符串形式表示。

ZINCRBY key increment member
例子 zincrby 键名 要处理的值(默认为正数,负数则减去) 成员名称
127.0.0.1:6379> zscore fruits pear
"8.9000000000000004"
127.0.0.1:6379> ZINCRBY fruits 10 pear
"18.899999999999999"
11、计算给定的一个或多个有序集的并集,并存储在新的 key 中

计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination

默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之

WEIGHTS

使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。

如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1

AGGREGATE

使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。

默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。

返回值

保存到 destination 的结果集的基数。

ZUNIONSTORE destination numkeys key [key ...] [AGGREGATE SUM|MIN|MAX]
例子 zunionstore 新集合名称 指定并集个数 并集的成员名1 并集的成员名2 聚合方式
redis> ZRANGE programmer 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"

redis> ZRANGE manager 0 -1 WITHSCORES
1) "herry"
2) "2000"
3) "mary"
4) "3500"
5) "bob"
6) "4000"
# 公司决定加薪。。。除了程序员。。。
redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3   
(integer) 6

redis> ZRANGE salary 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
7) "herry"
8) "6000"
9) "mary"
10) "10500"
11) "bob"
12) "12000"
12、计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中

计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination

默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.

ZINTERSTORE destination numkeys key [key ...]
例子 zinterstore 新集合名称 个数 成员1 成员2
redis > ZADD mid_test 70 "Li Lei"
(integer) 1
redis > ZADD mid_test 70 "Han Meimei"
(integer) 1
redis > ZADD mid_test 99.5 "Tom"
(integer) 1

redis > ZADD fin_test 88 "Li Lei"
(integer) 1
redis > ZADD fin_test 75 "Han Meimei"
(integer) 1
redis > ZADD fin_test 99.5 "Tom"
(integer) 1

redis > ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3

redis > ZRANGE sum_point 0 -1 WITHSCORES     # 显示有序集内所有成员及其 score 值
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"

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

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

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

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

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

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

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

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

推荐阅读更多精彩内容