1.redis 的命令 Sunion/SELECT/Scard/Srandmember
返回所有给定集合的并集
语法
SUNION key [key ...]
可用版本:
1.0.0
时间复杂度:
O(N) 其中 N 是所有给定集合中的元素总数。
ACL 类别:
@read, @set, @slow
返回由所有给定集合的并集得到的集合成员。
例如:
key1 = {a,b,c,d}
key2 = {c}
key3 = {a,c,e}
SUNION key1 key2 key3 = {a,b,c,d,e}
不存在的键被认为是空集。
#返回
数组回复:包含结果集成员的列表。
#例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNION key1 key2
1) "c"
2) "b"
3) "a"
4) "e"
5) "d"
redis>
SELECT 切换到指定的数据库
语法
SELECT index
可用版本:
1.0.0
时间复杂度:
O(1)
ACL 类别:
@fast, @connection
选择具有指定从零开始的数字索引的 Redis 逻辑数据库。新连接始终使用数据库 0。
可选 Redis 数据库是命名空间的一种形式:所有数据库仍然保存在同一个 RDB/AOF 文件中。
但是,不同的数据库可以有同名的键,以及类似的命令FLUSHDB,SWAPDB或者RANDOMKEY在特定的数据库上工作。
实际上,应该使用 Redis 数据库来分隔属于同一应用程序的不同键(如果需要),而不是为多个不相关的应用程序使用单个 Redis 实例。
使用 Redis Cluster 时,SELECT不能使用该命令,因为 Redis Cluster 只支持数据库零。
在 Redis 集群的情况下,拥有多个数据库将是无用的,并且是不必要的复杂性来源。
Redis 集群的设计和目标不可能在单个数据库上以原子方式操作命令。
由于当前选择的数据库是连接的属性,客户端应该跟踪当前选择的数据库并在重新连接时重新选择它。
虽然没有用于查询当前连接中所选数据库的命令,但CLIENT LIST输出显示了每个客户端的当前所选数据库。
#返回
简单的字符串回复
获取集合的成员数 Scard
语法
SCARD key
可用版本:
1.0.0
时间复杂度:
O(1)
ACL 类别:
@read, @set, @fast
返回存储在key处的集合的集合基数(元素数)。
#返回
整数回复:集合的基数(元素数),或者0如果key 不存在。
#例子
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2
redis>
随机返回多个集合成员 Srandmember
返回集合中一个或多个随机数
语法
SRANDMEMBER key [count]
可用版本:
1.0.0
时间复杂度:
没有计数参数 O(1),否则为 O(N),其中 N 是传递计数的绝对值。
ACL 类别:
@read, @set, @slow
当仅使用key参数调用时,从存储在的集合值中返回一个随机元素key。
如果count提供的参数是正数,则返回一个不同元素count的数组。数组的长度是count或集合的基数 (SCARD),以较低者为准。
如果使用否定调用,则行为会发生变化,并且允许该命令多次count返回相同的元素。在这种情况下,返回元素的数量是指定的绝对值。
#返回
Bulk string reply:没有附加count参数,该命令返回一个带有随机选择元素的 Bulk Reply,或者nil当key不存在时。
数组回复:当附加count参数被传递时,该命令返回一个元素数组,key如果不存在则返回一个空数组。
#例子
redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
"two"
redis> SRANDMEMBER myset 2
1) "one"
2) "three"
redis> SRANDMEMBER myset -5 #返回5个元素,允许重复。使用负值
1) "one"
2) "two"
3) "three"
4) "one"
5) "two"
redis>
#传递计数时的行为规范
当count参数为正值时,此命令的行为如下:
不返回重复的元素。
如果count大于集合的基数,则该命令将仅返回整个集合而不返回其他元素。
回复中元素的顺序并不是真正随机的,所以如果需要,由客户端来打乱它们。
当count为负值时,行为变化如下:
重复元素是可能的。
如果集合为空(不存在的键),则始终返回确切count的元素或空数组。
回复中元素的顺序是真正随机的。
#返回元素的分布
注意:本节仅适用于 Redis 5 或更低版本,因为 Redis 6 实现了更公平的算法。
当集合中的元素数量很少时,返回元素的分布远非完美,这是因为我们使用了一个近似的随机元素函数,
并不能真正保证良好的分布。
使用的算法在 dict.c 中实现,对哈希表桶进行采样以找到一个非空的桶。一旦找到一个非空桶,
由于我们在哈希表实现中使用了链接,因此检查桶内元素的数量并选择一个随机元素。
这意味着如果你在整个哈希表中有两个非空的桶,一个有三个元素,一个只有一个,
那么单独在它的桶中的元素将被返回的概率要高得多。
#历史
从 Redis 版本 2.6.0 开始:添加了可选count参数。