Redis 基本数据类型-有序集合
有序集合
在集合类型的基础上,有序集合类型为集合中的每一元素都关联了一个分数。
有序集合和列表类型的相似点:
1、都是有序的,
2、两者都可以获取某一范围的元素
有序集合和列表类型的不同点:
1、列表类型是通过链表实现的,所以靠近两端的数据极快,当元素增多时,访问中间元素的数据会变慢,更加适合实现如"新鲜事" 和"日志"这类很少访问中间数据的应用。
2、有序集合是使用散列表和跳跃表(skip list)实现的,读取中间部分的元素速度也很快(时间复杂度O(log(N))。
3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
4、有序集合要比列表类型更费内存。
常用命令
- 增加元素 zadd key score member [score member ...]
127.0.0.1:6379> zadd scoreboard 89 Tom 67 Peter 100 David
(integer) 3
- 获取元素的分数 zscore key member
127.0.0.1:6379> zscore scoreboard Tom
"89"
- 获取排名在某个范围的元素列表 zrange|zrevrange key start stop [withscores]
zrange命令按照分数从小到大的顺序返回所有从start到stop之间的所有元素(包括两端的元素)。zrange的时间复杂度为O(logn+m)[其中n是有序集合的基数,m为返回元素的个数]。
如果两个元素分数相同,Redis会按字典顺序("0"<"9"<"A"<"Z"<"a"<"z")来排序。进一步,中文取决于中文的编码方式。
zrevrange命令和zrange命令唯一的不同是,zrevrange是按照分数从大到小的顺序返回所有从start到stop之间的所有元素(包括两端的元素)。
127.0.0.1:6379> zrange scoreboard 0 2
1) "Peter"
2) "Tom"
3) "David"
127.0.0.1:6379> zrange scoreboard 1 -1
1) "Tom"
2) "David"
127.0.0.1:6379> zrange scoreboard 0 -1 withscores
1) "Peter"
2) "67"
3) "Tom"
4) "89"
5) "David"
6) "100"
- 获取指定分数范围的元素 zrangebyscore key min max [withscores] [limit offset count]
zrangebyscore 命令 返回按照元素分数从小到大的顺序返回分数在min和max之间的元素
如果希望分数不包含端点值,可以在分数前加"("
limit offset coutn命令即在获的元素列表的基础上偏移offset个元素,只取前count个。
127.0.0.1:6379> zrangebyscore scoreboard 80 100
1) "Tom"
2) "David"
127.0.0.1:6379> zrangebyscore scoreboard 80 (100
1) "Tom"
127.0.0.1:6379> zrangebyscore scoreboard 60 +inf limit 1 3
1) "Tom"
2) "David"
- 增加某个元素的分数 zincrby key increment member
127.0.0.1:6379> zadd scoreboard 56 jerry
(integer) 1
127.0.0.1:6379> zincrby scoreboard 4 jerry
"60"
- 获取集合中元素的数量 zcard key
127.0.0.1:6379> zcard scoreboard
(integer) 4
- 获取指定分数范围内元素的个数 zcount key min max
127.0.0.1:6379> zcount scoreboard 90 100
(integer) 1
- 删除一个或多个元素 zrem key member [member...]
127.0.0.1:6379> zrem scoreboard Tom
(integer) 1
127.0.0.1:6379> zcard scoreboard
(integer) 3
- 按照排名范围删除元素 zremrangebyrank key start stop
127.0.0.1:6379> zadd testRem 1 a 2 b 3 c 4 d 5 e 6 f
(integer) 6
127.0.0.1:6379> zremrangebyrank testRem 0 2
(integer) 3
127.0.0.1:6379> zrange testRem 0 -1
1) "d"
2) "e"
3) "f"
- 获取元素排名 zrank|zrevrank key member
zrank命令是按照元素分数从小到大的顺序获取元素的排名, zrevrank命令则相反
- 计算有序集合的交集 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键中的分数是每个参与计算的集合的该元素分数的最大值
127.0.0.1:6379> zadd sortedSets1 1 a 2 b
(integer) 2
127.0.0.1:6379> zadd sortedSets2 10 a 20 b
(integer) 2
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1
1) "a"
2) "b"
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "11"
3) "b"
4) "22"
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 aggregate min
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "1"
3) "b"
4) "2"
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 aggregate max
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
# 其中集合各个元素的权重算法是 a = sortedSets1.a * 1 + sortedSets2.a * 0.1, b = sortedSets2.b*1 + soretedSets2.b*0.1
127.0.0.1:6379> zinterstore sortedSetsResult 2 sortedSets1 sortedSets2 weights 1 0.1
(integer) 2
127.0.0.1:6379> zrange sortedSetsResult 0 -1 withscores
1) "a"
2) "2"
3) "b"
4) "4"
- 有序集合求交集 zunionstore 命令和zinterstore用法一样