4、Set(无序集合)
Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
sadd 命令
添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。
sadd key member
实例
127.0.0.1:6379> sadd myset one
(integer) 1
127.0.0.1:6379> sadd myset two
(integer) 1
127.0.0.1:6379> sadd myset three
(integer) 1
127.0.0.1:6379> sadd myset three
(integer) 0
127.0.0.1:6379> smembers myset
1) "one"
2) "three"
3) "two"
注意:以上实例中 three添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
其他常用命令:
增加删除命令
sadd key member [ member .... ]
srem key member [ member .... ]
sadd 命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元
素已经存在与集合中就会忽略这个元素。返回值是成功加入的元素数量(忽略的元素不计算在内)
srem 命令用来从集合中删除一个或多个元素,并返回删除成功的个数
获得集合中的所有元素
smembers key
返回集合中的所有元素
判断元素是否在集合中
sismember key member
判断一个元素是否在集合中是一个时间复杂度为 0(1) 的操作,无论集合中有多少个元素, sismember 命令始终可以极快的返回结果。当
值存在时 sismember 命令返回 1 ,当值不存在或者键不存在时返回 0
集合间运算
sdiff key [ key ...... ]
sdiff 命令用来对多个集合执行差集运算。集合 A 与集合 B 的差集表示为 A- B ,代表所有属于 A 且不属于 B 的元素构成的集合,即
A - B = { x| x∈A 且 x ∈/B }
命令使用方法:
192.168.137.101:0>sadd seta 1 2 3 4 6 7 8
"7"
192.168.137.101:0>sadd setb 2 3 4
"3"
192.168.137.101:0>sdiff seta setb
1) "1"
2) "6"
3) "7"
4) "8"
该命令支持同时传入多个键, 计算顺序是先计算 seta 和 setb 在计算结果与 setc 的差集
sadd setc 2 3 4
sdiff seta setb setc
sinter key [ key ..... ]
该命令用来对多个集合执行交集运算。集合 A 与集合 B 的交集表示为 A∩B,代表所有属于 A 且属于 B 的元素构成的集合
即 A∩B = { x| x∈A 且 x ∈B }
命令使用方法:
sinter seta setb
该命令同样支持同时传入多个键
sunion key [ key ...... ]
该命令用来对多个集合执行并集运算。集合 A 与集合 B的并集表示为 A∪B ,代表所有属于A或所有属于B的元素构成的集合
即 A∪B = { x| x∈A 或 x ∈B }
命令使用方法:
sunion seta setb
该命令同样支持同时传入多个键
获得集合中元素的个数
scard key
进行集合运算并将结果存储
sdiffstore destination key [ key ...... ]
sinterstore destination key [ key ...... ]
sunionstore destination key [ key ...... ]
sdiffstore 命令和 sdiff 命令功能一样,唯一的区别就是前者不会直接返回运算的结果,而是将结果存在 destination 键中
sinterstore 这个命令类似于 sinter 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
sunionstore 这个命令类似于 sunion 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
随机获得集合中的元素
srandmember key [ count ]
该命令用来随机从集合中获取一个元素
还可以传递 count 参数来一次随机获得多个元素,根据 count 的正负不同,具体表现也不同
当count 为正数时,srandmember 会随机获取从集合里获得 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则
srandmember 会返回集合中的全部元素
当 count 为负数时,srandmember 会随机从集合中获得 |count| 个的元素,这些元素有可能相同
注:当传递count 参数时,在windows环境下提示命令参数错误
从集合中弹出一个元素
spop key
由于集合类型的元素是无序的,所以 spop 命令会从集合中随机选择一个元素弹出,返回值为被移除的随机元素,如果 key 不存在或者
key 为空集时,返回 nil
5、zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令
添加元素到集合,元素在集合中存在则更新对应score
zadd key score member
实例
127.0.0.1:6379> zadd mysset 0 one
(integer) 1
127.0.0.1:6379> zadd mysset 2 three
(integer) 1
127.0.0.1:6379> zadd mysset 3 three
(integer) 0
127.0.0.1:6379> ZRANGEBYSCORE mysset 0 1000
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> zscore mysset three
"3"
有序集合类型(sorted set)
增加元素
zadd key score member [ score member ...... ]
zadd 命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在,则会用新的分数替换原有的分数。zadd命令的返回
值是新加入到集合中的元素个数(不包含之前已经存在的元素)
获得元素的分数
zscore key member
获得排名在某个范围的元素列表
zrange key start stop [ withscores ]
zrevrange key start stop [ withscores ]
zrange 命令会按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)。zrange 命令和 lrange 命
令十分相似,如索引都是从0开始,负数代表从后向前查找(-1 表示最后一个元素)。如果需要同时获得元素的分数的话,可以在
zrange 命令的尾部加上 widthscores 参数
注:如果两个元素的分数相同,redis会按照字典顺序(即 0<9<A<Z<a<z 这样的顺序)来进行排列。如果元素的值是中文,则取决于
中文的编码方式,如图:
zrevrange 命令和 zrange 的唯一不同在于 zrevrange 是按照元素分数从大到小的顺序给定结果的
获得指定分数范围内的元素
zrangebyscore key min max [ withscores ] [ limit offset count ]
该命令按照元素分数从小到大的顺序返回分数在 min 到 max 之间(包含 min 和max 的元素)
如果希望分数范围不包含端点值,可以在分数前加上 "(" 符号,例如:希望返回80分到100分的的数据,可以包含80分单不包含100分
命令:zrangebyscore scoreboard 80 (100 widthscores
min 和 max 还支持无穷大,同 zadd 命令一样,-inf 和 +inf 分别表示负无穷大和正无穷大。比如希望得到所有分数高于 80分(不
包含80分)的人的名单,但是却不知道最高分是多少,这是就可以使用 +inf
zrangebyscore scoreboard (80 +inf
命令 limit offset count 与 SQL 中的用法基本相同,即在获得的元素列表的基础上向后偏移 offset 个元素并且只获取前count个元素
zrevrangebyscore 不仅是按照元素分数从大往小的顺序给出结果,而且他的 min 和max 的参数的顺序和 zrangebyscore 命令是相
反的
增加某个元素的分数
zincrby key increment member
zincrby 命令可以增加一个元素的分数,返回值是更改后的分数,例如想给peter 加 4 分
zincrby scoreborder 4 peter
increment 也可以是负数表示减分
zincrby scoreborder -4 peter
如果指定元素不存在,redis 在执行命令前会先建立它并将他的值赋为0在执行操作
获得集合中元素的数量
zcard key
获得指定分数范围内的元素个数
zcount key min max
zcount 命令的 min max 参数的特性与 zrangebyscore 命令中的一样
删除一个或多个元素
zrem key member [ member .... ]
zrem 命令的返回值是成功删除的元素数量(不包含本来就不存在的元素)
按照排名范围删除元素
zremrangebyrank key start stop
按照元素分数从小到大的顺序(即索引 0 表示最小的值)删除在指定排名范围内的所有元素,并返回删除元素的数量
按照分数范围删除元素
zremrangebyscore key min max
zremrangebyscore 命令删除指定分数范围内的所有元素,参数 min 和 max 的特性和 zrangebyscore 命令中的一样,返回值是删除
元素的个数
获得元素的排名
zrank key member
zrevrank key member
zrank 命令会按照元素分数从小到大的顺序获得指定的元素排名(从 0 开始,即分数最小的元素排名为0)
zrebrank 命令则正好相反,分数最大的元素排名为0
计算有序集合的交集
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 键中元素的分数是参与计算的集合中该元素分数最大值
zinterstore 命令还能通过 weights 参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重
如:
计算集合间的并集
zunionstore
用法与 zinterstore 命令的用法一样