set 类型
Redis 中的 SET
类型是一种无序、唯一的字符串集合,支持高效的集合操作(如交集、并集、差集)。其与 list
类型相似, 但差别是: list
类型允许出现重复值, 而 set
类型不允许出现重复值。
set
类型格式如下:
key value1 value2...
常用命令
1. SADD
将指定元素添加到指定的 set
中。若已是此 set
中存在的元素, 则被忽略; 若不存在, 则添加。
语法:
SADD key member [member ...]
2. SMEMBERS
返回存储在指定 set
中的所有元素。
语法:
SMEMBERS key
3. SISMEMBER
判断指定的元素是否存在指定的 set
中, 若存在则返回 1, 若不存在则返回 0。
语法:
SISMEMBER key member
4. SREM
删除存储在指定 set
中的指定元素。若元素存在则删除, 并返回 1;若不存在,则将命令忽略,并返回 0。若指定的 key
不是 set
类型时, 将报错。
语法:
SREM key member [member ...]
5. SCARD
返回存储在 set
中的元素个数。
语法:
SCARD key
6. SRANDMEMBER
从 指定的set
中随机返回指定数量的元素, 默认为 1。
- 若指定的
set
为空, 则返回nil
。 - 若为指定的数为负数, 则返回这个数的绝对值数量的元素。
- 当指定数量为正数, 且大于
set
中所含元素数量时, 将返回set
中所存储的所有元素。 - 当指定数量为负数, 且其绝对值大于
set
中所含元素数量时, 将返回指定数量的绝对值数量的元素, 允许产生重复。
语法:
SRANDMEMBER key [count]
7. SPOP
随机返回并删除指定数量的指定 set
中的元素, 默认为 1。
语法:
SPOP key [count]
8. SMOVE
将一个元素从源 set
移动到指定 set
中。
-
若指定元素不存在于源
set
中, 返回 0 (失败) -
若指定元素存在于源
set
中, 返回 1(成功) -
若指定
set
不存在, 则系统会自动创建 -
若指定
set
的已包含指定的元素, 则系统会继续移动, 但set
因元素的唯一性会自动去重。 -
若指定的
key
不是set
, 则报类型错误WRONGTYPE Operation
。
语法:
SMOVE source destination member
source
: 源set
的键名。destination
: 目标set
的键名。member
: 要移动的元素。
注: 此命令是原子性的, 意味着此命令只会完全成功或完全失败
集合计算
差集计算:
1. SDIFF
对多个指定 set
的差集进行计算, 返回属于 key1
, 但不属于其他所有set
的元素。
语法:
SDIFF key1 key2 [key3 ...]
2. SDIFFSTORE
将差集的结果存储到指定的 set
中, 若指定的 set
已存在, 则将其覆盖。
语法:
SDIFFSTORE destination key1 key2 [key3 ...]
注意:
若 key1 不存在, 则返回空集
若其他 set 不存在, 则视为空集, 不影响结果
交集计算
1. SINTER
返回所有指定 set
的交集
语法:
SINTER key1 key2 [key3 ...]
2. SINTERSTORE
将交集的结果存储到指定的 set
中, 若指定的 set
已存在, 则将其覆盖。
语法:
SINTERSTORE destination key1 key2 [key3 ...]
注意:
若任意一个
key
不存在,结果为空集。所有指定
set
的共同元素才会被返回。
并集计算
1. SUNION
返回所有 set
的并集
语法:
SUNION key1 key2 [key3 ...]
2. SUNIONSTORE
将并集的结果存储到指定的 set
中, 若指定的 set
已存在, 则将其覆盖。
语法:
SUNIONSTORE destination key1 key2 [key3 ...]
注意:
不存在的
key
被视为空集,不影响结果。
应用场景
- 社交网络
- 差集:找出用户 A 关注但用户 B 未关注的人。
- 交集:找出共同好友。
- 并集:合并多个群组的成员。
- 电商系统
- 交集:筛选同时包含多个标签的商品(如“打折”且“库存充足”)。
- 数据分析
- 并集:统计多个日期内的独立访客总数(去重)。
通过合理使用集合运算,可以高效解决数据关联性问题,但需注意性能与数据规模的平衡。
性能
交集计算 (SINTER
) 在集合数量多或元素量大时可能较慢。
使用 *STORE
版本可减少客户端数据传输压力。