介绍
Redis支持两种集合分别是有序集合和无序集合
集合和列表之间的对比
集合类型 | 列表类型 | 有序集合类型 | |
---|---|---|---|
存储内容 | 最多 2 32 − 1 2 ^ {32} - 1 232−1个字符串 | 最多 2 32 − 1 2 ^ {32} - 1 232−1个字符串 | 最多 2 32 − 1 2 ^ {32} - 1 232−1个字符串 |
有序性 | 否 | 是 | 是 |
唯一性 | 是 | 否 | 是 |
运用场景
集合常用的操作是向集合中加入或删除元素;判断元素是否存在;
在多个集合之间还可以进行交集、并集、差集运算。
命令
一、集合
1.增加/删除元素
sadd key member [member …] :向集合添加元素,返回成功加入集合的个数
srem key member [member …] :删除集合中的元素,返回成功删除的个数
2.获取集合中的所有元素
smembers key
3.判断元素是否在集合中
sismember key member
存在返回1,不存在返回0
4.集合间运算
(1)差集
sdiff key [key…]
2.交集
sinter key [key…]
3.并集
sunion key [key …]
4.获取集合中元素的个数
scard key
5.进行集合运算并将结果存储
sdiffstore destination key [key …]
sinterstore destination key [key …]
sunionstore destination key [key …]
这个3个命令和之前的集合运算命令差不多,唯一的区别是不会返回运算结果,而是将结果放入destination键中。
这些命令常用于需要多步集合运算的场景,如先计算两个集合的差集,再将结果和其他集合计算并集。
6.随机获取集合中的元素
srendmember key [count]
count 为指定返回的元素个数
7.从集合中弹出一个元素
spop key 会从集合中随机选择一个元素弹出。
二、有序集合
redis的有序集合类型是在集合的基础上为每个元素都关联了一个分数,从而实现有序
有序集合和列表在某些功能上是一致的
相似点:
(1)二者都是有序的
(2)二者都可以获得某一范围的元素
但是二者的应用场景有很大不同
(1)列表是通过链表实现的,获取靠近两边的元素速度越快,当元素增多后,获取中间的元素,速度会变慢,所以它更加适合实现“新鲜事”或“排行榜”的应用
(2)有序集合类型使用的是散列表和跳跃表(Skip list)实现的,所以即使读取中间位置的数据,速度也是很快的。
(3)列表中不能简单地改变元素的位置,有序集合可以(改变分数就行)
(4)有序集合要比列表更加耗费内存
1.增加元素
zadd key score member [score member …]
该命令向有序集合中加入元素和该元素的分数,如果集合中已经有了该元素,则用新的分数代替原有的分数。
比如我们用有序集合zset 存储 “张三”,“李四”,“王五” 的工资。
假如此时发现李四的工资输错了,也可以修改
zadd zset 15000 李四
2.获得元素的分数
zscore key member
3.获得排名在某个范围的元素列表
zrange key start stop [withscores]
该命令会按照元素的分数从小到大返回从索引start 到stop之间的元素(0 -1 表示返回所有的元素);
加上参数withscores 会将分数也一起返回
4.获取指定分数范围的元素
zrangebyscore key min max [withscores] [limit offset count]
该命令按照元素分数从小到大的顺序返回分数在min和max之间的元素(包含min和max)
min和max 还可以用无穷大来表示 -inf 和 +inf 分别代表负无穷和正无穷
limit offset count 参数和数据库的用法一样,即在获得元素的基础上向后偏移offset个元素,并且只获取前count个元素。
在有序集合zset中再添加点元素方便演示
获取工资超过10003的人,如果希望分数范围不包含断点值可以加上“(”符号,如下表示不包含10003
获取工资高于10000的从第2个人开始的3个人
zrevrangebyscore 正好相反,会按元素分数从大到小排列
5.获取集合中元素的数量
zcard key
6.获取指定分数范围内的元素个数
zcount key min max
7.删除一个或多个元素
zrem key member [member …]
8.按照排名范围删除元素
zremrangebyrank key start stop
按照元素分数从小到大的顺序,删除指定排名范围内的所有元素。
9.按照分数范围删除元素
zremrangebyscore key min max
删除指定分数范围内的所有数据。
10.获取元素的排名
zrank key member
从0开始,分数最小的元素排名为0
zrevrank key member
分数最大的元素排名为0