Redis入门指南 --day003

接上节继续:Redis入门指南 --day002

  • 获得集合中元素个数
127.0.0.1:6379> smembers letters
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> scard letters
(integer) 3
  • 进行集合运算并将结果存储

SDIFF target key key… 多个集合的差集 并将结果存储在 target中
SINTER target key key… 多个集合的交集 并将结果存储在 target中
SUNION target key key… 多个集合的并集 并将结果存储在 target中

  • 随机获得集合中的元素

srandmember key [count]
(1)当count为正数时,SRANDMEMBER 会随机从集合里获得count个不重复的元素。如果count的值大于集合中的元素个数,则 SRANDMEMBER 会返回集合中的全部元素。
(2)当count为负数时,SRANDMEMBER 会随机从集合里获得|countl个的元素,这些元素有可能相同。

127.0.0.1:6379> srandmember letters
"c"
127.0.0.1:6379> srandmember letters 2
1) "a"
2) "c"

在这里插入图片描述

  • 从集合中弹出一个元素

SPOP key
SPOP命令,但由于集合类型的元素是无序的,所以 sPOP命令会从集合中随机选择一个元素弹出。例如:

127.0.0.1:6379> spop letters
"c"
127.0.0.1:6379> smembers letters
1) "b"
2) "a"
127.0.0.1:6379> sadd letters g h j
(integer) 3
127.0.0.1:6379> smembers letters
1) "b"
2) "g"
3) "h"
4) "a"
5) "j"
127.0.0.1:6379> spop letters 2
1) "b"
2) "j"

有序集合

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

有序集合类型在某些方面和列表类型有些相似。
(1)二者都是有序的。
(2)二者都可以获得某一范围的元素。
但是二者有着很大的区别,这使得它们的应用场景也是不同的。
(1)列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会较慢,所以它更加适合实现如“新鲜事”或“日志”这样很少访问中间元素的应用。
(2)有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以即使读取位于中间部分的数据速度也很快(时间复杂度是O(log(N)))。
(3)列表中不能简单地调整某个元素的位置,但是有序集合可以(通过更改这个元素的分数)。
(4)有序集合要比列表类型更耗费内存。
有序集合类型算得上是Redis 的5种数据类型中最高级的类型了,在学习时可以与列表类型和集合类型对照理解。

  • 增加元素

ZADD key score member
ZADD命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。ZADD命令的返回值是新加入到集合中的元素个数(不包含之前已经存在的元素)。

127.0.0.1:6379> zadd score 100 zhangsan 80 lisi 60 wangwu
(integer) 3
127.0.0.1:6379> zadd score 88.5 lisi
(integer) 0
  • 获得元素的分数
127.0.0.1:6379> zscore score zhangsan
"100"
  • 获得排名在某个范围的列表

ZRANGE key start stop [withscores]
ZREVRANGE key start stop [withscores]
ZRANGE命令会按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。ZRANGE命令与LRANGE命令十分相似,如索引都是从0开始,负数代表从后向前查找(-1表示最后一个元素)。就像这样:

127.0.0.1:6379> zrange score 0 2  # 从小到大
1) "wangwu"
2) "lisi"
3) "zhangsan"
127.0.0.1:6379> zrevrange score 0 2  # 从大到小
1) "zhangsan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> zrange score 0 2 withscores
1) "wangwu"
2) "60"
3) "lisi"
4) "88.5"
5) "zhangsan"
6) "100"
  • 获得指定分数范围的元素

ZRANGEBYSCORE key min max [withscores] [limit offset count]
ZREVRANGEBYSCORE key min max [withscores] [limit offset count]

127.0.0.1:6379> zrangebyscore score 80 100
1) "lisi"
2) "zhangsan"
# 如果希望分数范围不包含端点值,可以在分数前加上“(”符号。例如,希望返回”80分到100分的数据,
# 可以含80分,但不包含100分,则稍微修改一下上面的命令即可:
127.0.0.1:6379> zrangebyscore score 80 (100
1) "lisi"
127.0.0.1:6379> zrange score 0 6 withscores
 1) "qinba"
 2) "50"
 3) "maliu"
 4) "60"
 5) "wangwu"
 6) "60"
 7) "zhaoqi"
 8) "70"
 9) "lisi"
10) "88.5"
11) "zhangsan"
12) "100"
# 想获得分数高于60分的从第二个人开始的2个人:

127.0.0.1:6379> zrangebyscore score 60 100 limit 1 2
1) "wangwu"
2) "zhaoqi"
  • 增加某个元素的分数
# 给 lisi 增加 0.5127.0.0.1:6379> zincrby score 0.5 lisi
"89"
127.0.0.1:6379> zincrby score -1 lisi
"88"

其他命令

127.0.0.1:6379> zrange score 0 6 withscores
 1) "qinba"
 2) "50"
 3) "maliu"
 4) "60"
 5) "wangwu"
 6) "60"
 7) "zhaoqi"
 8) "70"
 9) "lisi"
10) "88.5"
11) "zhangsan"
12) "100"
# 获得集合中的元素个数

127.0.0.1:6379> zcard score
(integer) 6
# 获得指定分数范围内元素个数
127.0.0.1:6379> zcount score 90 100
(integer) 1
# 删除一个或多个元素
127.0.0.1:6379> zrem score zhangsan
(integer) 1
# 按照排名范围删除元素

127.0.0.1:6379> zremrangebyrank score 0 1
(integer) 2
127.0.0.1:6379> zrange score 0 -1
1) "wangwu"
2) "zhaoqi"
3) "lisi"

127.0.0.1:6379> zadd test 1 a 2 b 3 c
(integer) 3
# 按照分数范围删除元素
127.0.0.1:6379> zremrangebyscore test 1 2
(integer) 2
127.0.0.1:6379> zrange test 0 2
1) "c"

127.0.0.1:6379> zadd test 4 d 5 e 6 f
(integer) 3
# 获得元素排名
127.0.0.1:6379> zrank test e
(integer) 2
127.0.0.1:6379> zrange test 0 -1 withscores
1) "c"
2) "3"
3) "d"
4) "4"
5) "e"
6) "5"
7) "f"
8) "6"
# 计算有序集合的交集

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值