Redis 基本数据类型-集合类型

集合类型

集合中每个元素都是不同的, 且是无须的, 一个集合类型(set)键可以存储最多2^32-1个字符串。
集合的常用操作是向集合添加或删除元素,判断某个元素是否存在。
由于集合类型在Redis内部是使用值为空的散列表(hash table)实现的,所以操作的时间复杂度都是O(1)。最方便的就是集合类型键间的交集,并集和差集运算。

常用命令

  • 增加元素 sadd key member [member ...]

sadd命令会向集合中添加一个或多个元素,如果键不存在,会自动创建,如果要加入的元素已存在集合中就会忽略这个元素。并返回加入成功的元素的数量。

  • 删除元素 srem key member [member ...]

srem命令是用来删除一个或多个元素, 并返回删除成功的个数

127.0.0.1:6379> sadd letters a
(integer) 1
127.0.0.1:6379> sadd letters a b c
(integer) 2
127.0.0.1:6379> srem letters c d
(integer) 1
  • 获取集合中的所有元素 smembers key
127.0.0.1:6379> smembers letters
1) "b"
2) "a"
  • 判断元素是否存在与集合中 sismember key member
127.0.0.1:6379> sismember letters a
(integer) 1
127.0.0.1:6379> sismember letters d
(integer) 0

集合间的运算

  • 对多个集合执行差集运算 sdiff key [key ...]

集合A与集合B的差集表示为A-B, 代表属于A且不属于B的元素构成的集合

127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB
1) "1"
127.0.0.1:6379> sdiff setB setA
1) "4"
  • 表示对多个集合执行交集运算。 sinter key [key ...]

集合A和集合B的交集表示A ∩ B, 代表所有属于且属于B的元素的集合。

127.0.0.1:6379> sinter setA setB
1) "2"
2) "3"
  • 表示对多个集合执行并集运算。 sunion key [key ...]

集合A和集合B的并集表示A∪B, 代表所有属于A或属于B的元素的集合。

127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
  • 获取集合中元素的个数 scard key
127.0.0.1:6379> smembers letters
1) "b"
2) "a"
127.0.0.1:6379> scard letters
(integer) 2

补充命令

  • 对多个集合执行差集运算,并将结果存到destination中。sdiffstore destination key [key ...]
  • 对多个集合执行交集运算,并将结果存到destination中。sinterstore destination key [key...]
  • 对多个集合执行并集运算,并将结果存到destination中。sunionstore destination key [key ...]
  • 随机获取集合中的元素 srandmember key [count]

当count为正数时,srandmember会随机从集合中获取count个不重复的元素。若count大于集合中的所有元素,则返回全部集合元素
当count为负数时,srandmember会随机从集合中获取|count|个元素,这些元素有可能相同。

127.0.0.1:6379> srandmember letters
"b"
127.0.0.1:6379> srandmember letters
"a"
127.0.0.1:6379> srandmember letters
"b"

srandmember的说明:
srandmember返回的数据似乎不是非常的随机,出现这种情况的原因是集合类型采用的存储结构是散列表造成。散列表使用散列函数将元素映射到不同存储位置(桶)上实现O(1)时间复杂度的查询。当两个不同元素的散列表值相同时会出现冲突,Redis使用拉链法来解决冲突,即将散列表冲突的元素已链表的形式存储到另外一个桶中, 查找元素时先找到元素对应的桶,在从桶中的链表找到对应的元素。
使用srandmember命令从集合中获取随机元素时,Redis会从所有桶中随机选择一个桶,在从桶中所有元素,随机选取一个元素,所以元素所在桶的元素数量越小,被随机选中的可能性越大。

  • 从集合中弹出一个元素 spop key

因为集合类型的元素是无序的,spop命令会随机从集合中弹出一个元素。

127.0.0.1:6379> spop letters
"b"
posted @ 2020-08-13 17:01  phper-liunian  阅读(159)  评论(0编辑  收藏  举报