数据结构之Set
将任意多个不相同的元素存储到集合中。
SADD:将元素添加到集合
SREM:从集合中移除元素
SMOVE:将元素从一个集合移动到另一个集合
SMOVE source target element
即使用户想要移动的元素已经存在于目标集合,SMOVE命令仍然会将指定的元素从源集合移动到目标集合,并覆盖目标集合中的相同元素。从结果来看,这种移动不会改变目标集合包含的元素,只会导致被移动的元素从源集合中消失。
SMEMBERS:获取集合包含的所有元素
SCARD:获取集合包含的元素数量
SISMEMBER:检查给定元素是否存在于集合
SRANDMEMBER:随机获取SET中的元素
SRANDMEMBER set [count]
SRANDMEMBER命令接受一个可选的count参数,用于指定用户想要获取的元素数量,如果用户没有给定这个参数,那么SRANDMEMBER命令默认只获取一个元素。
如果count参数的值为正数且小于集合包含的元素数量,那么SRANDMEMBER命令将返回count个不重复的元素。当count参数的值大于等于集合包含的元素数量时,SRANDMEMBER命令将返回集合包含的所有元素。
如果count参数的值为负数,那么SRANDMEMBER命令将随机返回abs(count)个元素(abs(count)也即是count的绝对值),并且在这些元素当中允许出现重复的元素。
SPOP:随机地从集合中移除指定数量的元素
SPOP命令会返回被移除的元素作为命令的返回值。
SINTER、SINTERSTORE:对集合执行交集计算
SUNION、SUNIONSTORE:对集合执行并集计算
SDIFF、SDIFFSTORE:对集合执行差集计算
差集是一种集合运算,记A,B是两个集合,则所有属于A且不属于B的元素构成的集合,叫做集合A减集合B(或集合A与集合B之差),类似地,对于集合A、B,把集合{x∣x∈A,且x∉B}叫做A与B的差集。
数据结构之Sorted Set
Redis的有序集合(sorted set)同时具有“有序”和“集合”两种性质,这种数据结构中的每个元素都由一个成员和一个与成员相关联的分值组成,其中成员以字符串方式存储,而分值则以64位双精度浮点数格式存储。
与集合一样,有序集合中的每个成员都是独一无二的,同一个有序集合中不会出现重复的成员。与此同时,有序集合的成员将按照它们各自的分值大小进行排序。有序集合的分值除了可以是数字之外,还可以是字符串"+inf"或者"-inf",这两个特殊值分别用于表示无穷大和无穷小。
需要注意的是,虽然同一个有序集合不能存储相同的成员,但不同成员的分值却可以是相同的。**当两个或多个成员拥有相同的分值时,Redis将按照这些成员在字典序中的大小对其进行排列。**如果成员"apple"和成员"zero"都拥有相同的分值100,那么Redis将认为成员"apple"小于成员"zero",这是因为在字典序中,字母"a"开头的单词要小于字母"z"开头的单词。
ZADD:添加或更新成员
ZADD sorted_set score member [score member ...]
redis> ZADD salary 3500 "peter" 4000 "jack" 2000 "tom" 5500 "mary"
(integer) 4 -- 这个命令向有序集合新添加了4个成员
ZADD命令除了可以向有序集合添加新成员之外,还可以对有序集合中已存在成员的分值进行更新:在默认情况下,如果用户在执行ZADD命令时,给定成员已经存在于有序集合中,并且给定的分值和成员现有的分值并不相同,那么ZADD命令将使用给定的新分值去覆盖现有的旧分值。
允许用户在执行ZADD命令时,通过使用可选的XX选项或者NX选项来显式地指示命令只执行更新操作或者只执行添加操作。
在给定XX选项的情况下,ZADD命令只会对给定成员当中已经存在于有序集合的成员进行更新,而那些不存在于有序集合的给定成员则会被忽略。换句话说,带有XX选项的ZADD命令只会对有序集合已有的成员进行更新,而不会向有序集合添加任何新成员。
在给定NX选项的情况下,ZADD命令只会把给定成员当中不存在于有序集合的成员添加到有序集合里面,而那些已经存在于有序集合中的给定成员则会被忽略。换句话说,带有NX选项的ZADD命令只会向有序集合添加新成员,而不会对已有的成员进行任何更新。
用户可以通过给定CH选项,让ZADD命令返回被修改(changed)成员的数量作为返回值。
“被修改成员”指的是新添加到有序集合的成员,以及分值被更新了的成员。
ZREM:移除指定的成员
ZSCORE:获取成员的分值
ZINCRBY:对成员的分值执行自增或自减操作
ZCARD:获取有序集合的大小
ZRANK、ZREVRANK:获取成员在有序集合中的排名
其中ZRANK命令返回的是成员的升序排列排名,即成员在按照分值从小到大进行排列时的排名,而ZREVRANK命令返回的则是成员的降序排列排名,即成员在按照分值从大到小进行排列时的排名。
ZRANGE、ZREVRANGE:获取指定索引范围内的成员
ZRANGE sorted_set start end
ZREVRANGE sorted_set start end
命令中的start索引和end索引指定的是闭区间索引范围,也就是说,位于这两个索引上的成员也会包含在命令返回的结果当中。
在默认情况下,ZRANGE命令和ZREVRANGE命令只会返回指定索引范围内的成员,如果用户想要在获取这些成员的同时也获取与之相关联的分值,那么可以在调用ZRANGE命令或者ZREVRANGE命令的时候,给定可选的WITHSCORES选项。
redis> ZRANGE salary 0 1 WITHSCORES
- "peter"
- "3500" -- 成员"peter"的分值
- "bob"
- "3800" -- 成员"bob"的分值
ZRANGEBYSCORE、ZREVRANGEBYSCORE:获取指定分值范围内的成员
ZRANGEBYSCORE sorted_set min max
ZREVRANGEBYSCORE sorted_set max min
ZRANGEBYSCORE命令和ZREVRANGEBYSCORE命令接受min参数和max参数的顺序正好相反。
在默认情况下,ZRANGEBYSCORE命令和ZREVRANGEBYSCORE命令会直接返回给定分值范围内的所有成员,但如果范围内的成员数量较多,或者我们只需要范围内的其中一部分成员,那么可以使用可选的LIMIT选项来限制命令返回的成员数量:
ZRANGEBYSCORE sorted_set min max [LIMIT offset count]
ZREVRANGEBYSCORE sorted_set max min [LIMIT offset count]
LIMIT选项接受offset和count两个参数作为输入,其中offset参数用于指定命令在返回结果之前需要跳过的成员数量,而count参数则用于指示命令最多可以返回多少个成员。
在默认情况下,ZRANGEBYSCORE命令和ZREVRANGEBYSCORE命令接受的分值范围都是闭区间分值范围,也就是说,分值等于用户给定最大分值或者最小分值的成员也会被包含在结果当中。如果用户想要定义的是开区间而不是闭区间,那么可以在给定分值范围时,在分值参数的前面加上一个单括号“(”,这样,具有给定分值的成员就不会出现在命令返回的结果当中。
以下命令只会返回分值大于等于3500且小于5000的成员:
redis> ZRANGEBYSCORE salary 3500 (5000 WITHSCORES
- "peter"
- "3500"
- "bob"
- "3800"
- "jack"
- "4500"
ZRANGEBYSCORE命令和ZREVRANGEBYSCORE命令的min参数和max参数除了可以是普通的分值或者带有(符号的分值之外,还可以是特殊值+inf或者-inf,前者用于表示无穷大,而后者则用于表示无穷小。
ZCOUNT:统计指定分值范围内的成员数量
ZREMRANGEBYRANK:移除指定排名范围内的成员
ZREMRANGEBYSCORE:移除指定分值范围内的成员
ZUNIONSTORE、ZINTERSTORE:有序集合的并集运算和交集运算
ZUNIONSTORE destination numbers sorted_set [sorted_set ...]
ZINTERSTORE destination numbers sorted_set [sorted_set ...]
命令的numbers参数用于指定参与计算的有序集合数量,之后的一个或多个sorted_set参数则用于指定参与计算的各个有序集合键,计算得出的结果则会存储到destination参数指定的键中。ZUNIONSTORE命令和ZINTERSTORE命令都会返回计算结果包含的成员数量作为返回值。
并集图示:
交集结果图示:
Redis为ZUNIONSTORE命令和ZINTERSTORE命令提供了可选的AGGREGATE选项,通过这个选项,用户可以决定使用哪个聚合函数来计算结果有序集合成员的分值。
在默认情况下,ZUNIONSTORE和ZINTERSTORE将直接使用给定有序集合的成员分值去计算结果有序集合的成员分值,但是在有需要的情况下,用户也可以通过可选的WEIGHTS参数为各个给定有序集合的成员分值设置权重:
ZUNIONSTORE destination numbers sorted_set [sorted_set ...] [WEIGHTS weight [weight ...]]
ZINTERSTORE destination numbers sorted_set [sorted_set ...] [WEIGHTS weight [weight ...]]
在使用WEIGHTS选项时,用户需要为每个给定的有序集合分别设置一个权重,命令会将这个权重与成员的分值相乘,得出成员的新分值,然后执行聚合计算;与此相反,如果用户在使用WEIGHTS选项时,不想改变某个给定有序集合的分值,那么只需要将那个有序集合的权重设置为1即可。
ZUNIONSTORE和ZINTERSTORE除了可以使用有序集合作为输入之外,还可以使用集合作为输入。
ZRANGEBYLEX、ZREVRANGEBYLEX:返回指定字典序范围内的成员
当有序集合的所有成员都拥有相同的分值时,有序集合的成员将不再根据分值进行排序,而是根据字典序进行排序。在这种情况下,本章前面介绍的根据分值对成员进行操作的命令,比如ZRANGEBYSCORE、ZCOUNT和ZREMRANGEBYSCORE等,都将不再适用。为了让用户可以对字典序排列的有序集合执行类似ZRANGEBYSCORE这样的操作,Redis提供了相应的ZRANGEBYLEX、ZREVRANGEBYLEX、ZLEXCOUNT和ZREMRANGEBYLEX命令。
ZRANGEBYLEX sorted_set min max
命令的min参数和max参数用于指定用户想要获取的字典序范围,它们的值可以是以下4种值之一:
- 带有 [ 符号的值表示在结果中包含与给定值具有同等字典序大小的成员。
- 带有**(** 符号的值表示在结果中不包含与给定值具有同等字典序大小的成员。
- 加号+表示无穷大。
- 减号-表示无穷小。
如果我们想要获取words有序集合中所有以字母"a"开头的成员,那么只需要将min参数的值设置为[a,max参数的值设置为(b即可
redis> ZRANGEBYLEX words [a (b
- "address"
- "after"
- "apple"
ZREVRANGEBYLEX 逆序版的ZRANGEBYLEX命令。