Day16 Redis应用实战-SortedSet操作

Redis 资料型态SortedSet

  • Sorted Set与Hash一样,可以存放很多key and value.Sorted Set 的每个key (member)不可以重覆,而且key必须为浮点数,被称为score,可以依据score排序,存取方式与hash相同,也可以依照score与score sort 顺序存取.

  • 可用指令

    • ZADD
    • ZSCORE
    • ZINCRBY
    • ZCARD
    • ZCOUNT
    • ZRANGE
    • ZREVRANGE
    • ZRANGEBYSCORE
    • ZREVRANGEBYSCORE
    • ZRANK
    • ZREVRANK
    • ZREM
    • ZREMRANGEBYRANK
    • ZREMRANGEBYSCORE
    • ZRANGEBYLEX
    • ZLEXCOUNT
    • ZREMRANGEBYLEX
    • ZSCAN
    • ZUNIONSTORE
    • ZINTERSTORE
  • 资料结构

    • Sorted Set如果所有的key value个数 < 128且所有key长度都 < 64 bytes,则使用ziplist,否则使用skiplist.

ZADD

在sorted set 加入member.

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2


127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

127.0.0.1:6379> zrange engtest 0 -1 withscores
1) "eagle"
2) "80"
3) "linda"
4) "85"
5) "jack"
6) "90"
7) "doris"
8) "99"

ZRANGE

查询sorted set中的指定最大与最小member并正向排序,可以包含score.
(如果score分数一样则会按照value的字母进行排序)

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2

# 0 "eagle" -4
# 1 "linda" -3
# 2 "jack"  -2
# 3 "doris" -1
# 取得engtest范围内的member,将score正向排序
127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

# 取得engtest范围内的member,需要包含score内容
127.0.0.1:6379> zrange engtest 0 -1 withscores
1) "eagle"
2) "80"
3) "linda"
4) "85"
5) "jack"
6) "90"
7) "doris"
8) "99"

# 取得engtest范围内的member,将score反向排序
127.0.0.1:6379> zrange engtest 0 -1 rev
1) "doris"
2) "jack"
3) "linda"
4) "eagle"

# 取得engtest范围内的member中score最高的两个
127.0.0.1:6379> zrange engtest 0 1 rev
1) "doris"
2) "jack"

ZREVRANGE

查询sorted set中的指定最大与最小member并反向排序,可以包含score.
(如果score分数一样则会按照value的字母进行排序)

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4


# 0 "eagle" -4
# 1 "linda" -3
# 2 "jack"  -2
# 3 "doris" -1
# 取得engtest范围内的member,将score反向排序
127.0.0.1:6379> zrevrange engtest 0 -1
1) "doris"
2) "jack"
3) "linda"
4) "eagle"

# 取得engtest范围内的member,需要包含score内容
127.0.0.1:6379> zrevrange engtest 0 -1 withscores
1) "doris"
2) "99"
3) "jack"
4) "90"
5) "linda"
6) "85"
7) "eagle"
8) "80"

ZCARD

取得sorted set中member的个数.

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2

127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

127.0.0.1:6379> zcard engtest
(integer) 4

ZCOUNT

取得sorted set中score符合范围内的member总数.

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2

127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

# 取得engtest中member score在80 ~ 90 的总数
127.0.0.1:6379> zcount engtest 80 90
(integer) 3

ZLEXCOUNT

取得sorted set中member的value字串在范围的个数.

127.0.0.1:6379> zadd mytest 0 a 0 b 0 c 0 d 0 e 0 f 0 g 0 h 0 i
(integer) 9

127.0.0.1:6379> zrangebylex mytest - +
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
8) "h"
9) "i"

# 取的mytest中member的value字串在 -无限大 到 +无限大 范围内的个数
127.0.0.1:6379> zlexcount mytest - +
(integer) 9

# 取的mytest中member的value字串在 包含c 到 包含g 范围内的个数
127.0.0.1:6379> zlexcount mytest [c [g
(integer) 5

ZRANK

取得sorted set中指定member的正向排序.

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2

127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

127.0.0.1:6379> zrank engtest eagle
(integer) 0

127.0.0.1:6379> zrank engtest linda
(integer) 1

ZREVRANK

取得sorted set中指定member的反向排序.

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2

127.0.0.1:6379> zrevrange engtest 0 -1
1) "doris"
2) "jack"
3) "linda"
4) "eagle"

127.0.0.1:6379> zrevrank engtest eagle
(integer) 3

127.0.0.1:6379> zrevrank engtest linda
(integer) 2

ZSCORE

取得sorted set中指定member的score.

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2

127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

# 取得engtest中eagle的score
127.0.0.1:6379> zscore engtest eagle
"80"

ZINCRBY

设定sorted set中指定member的score增加.

127.0.0.1:6379> zadd engtest 90 jack 85 linda
(integer) 2

127.0.0.1:6379> zadd engtest 99 doris 80 eagle
(integer) 2

127.0.0.1:6379> zrange engtest 0 -1 withscores
1) "eagle"
2) "80"
3) "linda"
4) "85"
5) "jack"
6) "90"
7) "doris"
8) "99"

# 将engtest中member linda的score加6
127.0.0.1:6379> zincrby engtest 6 linda
"91"

127.0.0.1:6379> zrange engtest 0 -1 withscores
1) "eagle"
2) "80"
3) "jack"
4) "90"
5) "linda"
6) "91"
7) "doris"
8) "99"

ZRANGEYSCORE

取得sorted set 中member的score正向排序在指定范围内.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

# 取得engtest中member的score正向排序在 90 ~ 100
127.0.0.1:6379> zrangebyscore engtest 90 100
1) "jack"
2) "doris"

ZREVRANGEBYSCORE

取得sorted set 中member的score反向排序在指定范围内.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

# 取得engtest中member的score反向排序在 90 ~ 100
127.0.0.1:6379> zrevrangebyscore engtest 90 100
(empty array)

# 取得engtest中member的score反向排序在 100 ~ 90
127.0.0.1:6379> zrevrangebyscore engtest 100 90
1) "doris"
2) "jack"

# 取得engtest中member的score反向排序在 -无限大 ~ +无限大 = 所有 取2个
127.0.0.1:6379> zrevrangebyscore engtest -inf +inf limit 0 2
(empty array)

# 取得engtest中member的score反向排序在 +无限大 ~ -无限大 =所有 取2个
127.0.0.1:6379> zrevrangebyscore engtest +inf -inf limit 0 2
1) "doris"
2) "jack"

ZRANGEBYLEX

取得sorted set 中membe的value字母正向排序在指定范围内.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

127.0.0.1:6379> zrangebylex engtest - +
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

127.0.0.1:6379> zadd mytest 0 a 0 b 0 c 0 d 0 e 0 f 0 g 0 h 0 i
(integer) 9

# 取得mytest中member的value范围 -无限大到包含d
127.0.0.1:6379> zrangebylex mytest - [d
1) "a"
2) "b"
3) "c"
4) "d"

# 取得mytest中member的value范围 -无限大到不包含d
127.0.0.1:6379> zrangebylex mytest - (d
1) "a"
2) "b"
3) "c"

# 取得mytest中member的value范围 包含b到不包含h
127.0.0.1:6379> zrangebylex mytest [b (h
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
6) "g"

ZREM

删除sorted test中指定member.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

# 删除engtest中member是eagle
127.0.0.1:6379> zrem engtest eagle
(integer) 1

127.0.0.1:6379> zrange engtest 0 -1
1) "jack"
2) "linda"
3) "doris"

ZREMRANGEBYSCORE

删除sorted test中member的score反向排序在指定范围内.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

# 删除engtest中member的score在 0 ~ 90
127.0.0.1:6379> zremrangebyscore engtest 0 90
(integer) 3

127.0.0.1:6379> zrange engtest 0 -1
1) "doris"

ZREMRANGEBYLEX

删除sorted set中member的value字母正向排序在指定范围内.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

# 删除engtest中member的value字母在所有范围内的
127.0.0.1:6379> zremrangebylex engtest - +
(integer) 4

127.0.0.1:6379> zadd mytest 0 a 0 b 0 c 0 d 0 e 0 f 0 g 0 h 0 i
(integer) 9

# 删除engtest中member的value字母在 -无限大 到 包含d 范围内的
127.0.0.1:6379> zremrangebylex mytest - [d
(integer) 4

127.0.0.1:6379> zrange mytest 0 -1
1) "e"
2) "f"
3) "g"
4) "h"
5) "i"

ZREMRANGEBYRANK

删除sorted set中正向排序後指定范围的member.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

# 删除engtest中正向排序 0 ~ 2 的member
127.0.0.1:6379> zremrangebyrank engtest 0 2
(integer) 3

127.0.0.1:6379> zrange engtest 0 -1
1) "doris"

ZSCAN

扫描sorted set中指定member 特定match pattern与次数.

127.0.0.1:6379> zadd engtest 90 jack 85 linda 99 doris 80 eagle
(integer) 4

127.0.0.1:6379> zrange engtest 0 -1
1) "eagle"
2) "linda"
3) "jack"
4) "doris"

127.0.0.1:6379> zscan engtest 0 match e*
1) "0"
2) 1) "eagle"
   2) "80"

ZUNIONSTORE

取得多个sorted set中member的交集,并存入另外一个sorted set中,可加入weights进行加乘.

127.0.0.1:6379> zadd mytest1 1 a 2 b 3 c
(integer) 3

127.0.0.1:6379> zadd mytest2 5 a 7 b 3 c
(integer) 3

127.0.0.1:6379> zrange mytest1 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"

127.0.0.1:6379> zrange mytest2 0 -1 withscores
1) "c"
2) "3"
3) "a"
4) "5"
5) "b"
6) "7"

# 将mytest1与mytest2中交集的member进行weights後写入到mytest3
127.0.0.1:6379> zunionstore mytest3 2 mytest1 mytest2 weights 2 3
(integer) 3

127.0.0.1:6379> zrange mytest3 0 -1 withscores
1) "c"
2) "15"
3) "a"
4) "17"
5) "b"
6) "25"

ZINTERSTORE

取得多个sorted set中member的联集,并存入另外一个sorted set中.

127.0.0.1:6379> zadd mytest1 1 a 2 b 3 c
(integer) 3

127.0.0.1:6379> zadd mytest2 5 a 7 b 3 c
(integer) 3

127.0.0.1:6379> zrange mytest1 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"

127.0.0.1:6379> zrange mytest2 0 -1 withscores
1) "c"
2) "3"
3) "a"
4) "5"
5) "b"
6) "7"

# 将mytest1与mytest2中联集的member後写入到mytest4
127.0.0.1:6379> zinterstore mytest4 2 mytest1 mytest2
(integer) 3

127.0.0.1:6379> zrange mytest4 0 -1 withscores
1) "a"
2) "6"
3) "c"
4) "6"
5) "b"
6) "9"

<<:  Strengths based management

>>:  [Day 26] 趋势化资料实作(一)

DAY17 机器学习专案实作-员工离职预测(中)

ㄧ、资料前处理 1. 补值、删值 前面我们透过视觉化的方式找到资料有缺值,因此我们要将资料进行补值。...

Day 02 HTML<表格标签>

表格标签主要用来显示以及展示数据,可用表格标签排版後让数据更容易阅读 1. 表格基础标签简易介绍 (...

虾皮 Open Platform 与经典程序流程图

不管是在哪开始学习写程序,都一定会看到最经典的流程图: 至今,流程图的正确画法也不是那麽容易被在乎,...

[LeetCode30] Day30 - END

教授说12点前要看到实验结果,但我组长看我不先发文,也想把我杀了,人真难做,我只好先来发文QQ 心得...

Day 9-假物件 (Fake) - 虚设常式 (Stub)-1 (核心技术-1)

虚设常式(Stub)简介 今天的文章进入了新的系列,那因为接下来的概念是非常抽象的,所以会介绍数个核...