# Redis无序集合(Set)
概念
Redis无序集合(Set)是一个无序且元素唯一的集合数据结构,类似于数学中的集合。所有成员(元素)自动去重,且没有固定顺序,适合存储需要快速判断成员是否存在或执行集合运算的场景。
# 作用
去重存储:自动确保元素唯一性。
集合运算:支持交集(
SINTER
)、并集(SUNION
)、差集(SDIFF
)等操作。快速检索:高效判断元素是否存在(
SISMEMBER
)。动态管理:支持增删元素(
SADD
/SREM
)和统计(SCARD
)。
# 特性
核心特性包括:
无序性:元素存储无顺序,无法通过索引访问。
唯一性:自动去重,重复插入的元素会被忽略。
高性能:添加、删除、查询操作时间复杂度为 O(1)。
# 场景
共同好友:计算两个用户的共同关注列表。
投票去重:确保用户对同一内容仅投票一次。
随机推荐:随机返回集合中的元素(如抽奖)。
数据筛选:通过集合运算筛选符合条件的数据。
# 示例
# 1.创建无序集合并初始化数据
# 创建主城市集合(mainCity)
127.0.0.1:6379> SADD mainCity beijing shanghai guangzhou shenzhen
(integer) 4
# 创建南方城市集合(southCity)
127.0.0.1:6379> SADD southCity shanghai guangzhou shenzhen
(integer) 3
# 创建北方城市集合(northCity)
127.0.0.1:6379> SADD northCity beijing
(integer) 1
# 2.添加元素
# 向 mainCity 添加新城市 hangzhou(已存在则忽略)
127.0.0.1:6379> SADD mainCity hangzhou
(integer) 1 # 返回实际添加的元素数量
# 向 southCity 添加新城市 hangzhou(已存在则忽略)
127.0.0.1:6379> SADD southCity hangzhou
(integer) 1 # 返回实际添加的元素数量
# 3.获取集合大小
# 查看 mainCity 的城市数量
127.0.0.1:6379> SCARD mainCity
(integer) 5 # 包含新增的 hangzhou
# 4.计算差集
# 计算 mainCity 与 southCity 的差集(北方城市)
127.0.0.1:6379> SDIFF mainCity southCity
1) "beijing"
# 5.计算交集
# 计算 mainCity 与 southCity 的交集(南方城市)
127.0.0.1:6379> SINTER mainCity southCity
1) "hangzhou" # 数据是相同的,但不同测试输出顺序不固定
2) "shanghai"
3) "shenzhen"
4) "guangzhou"
即使多次执行相同的SINTER mainCity southCity
命令,返回元素的顺序可能不同。这是由无序集合的底层实现(哈希表)决定的。
# 6.判断元素是否存在
# 检查 beijing 是否在 northCity 中
127.0.0.1:6379> SISMEMBER northCity beijing
(integer) 1 # 存在返回 1
# 7.获取所有元素
# 查看 mainCity 的所有城市(无序输出)
127.0.0.1:6379> SMEMBERS mainCity
1) "beijing"
2) "shanghai"
3) "guangzhou"
4) "shenzhen"
5) "hangzhou"
# 8.删除元素
# 从 mainCity 中删除 hangzhou
127.0.0.1:6379> SREM mainCity hangzhou
(integer) 1 # 返回实际删除的元素数量
# 9.计算并集
# 计算 southCity 和 northCity 的并集(所有城市)
127.0.0.1:6379> SUNION southCity northCity
1) "beijing"
2) "shanghai"
3) "guangzhou"
4) "shenzhen"
5) "hangzhou"
# 命令集
在 Redis 客户端(如 redis-cli )可以通过help @set
命令查找所有与无序集合相关的命令,效果如下:
127.0.0.1:6379> help @set
SADD key member [member ...]
summary: Add one or more members to a set
since: 1.0.0
SCARD key
summary: Get the number of members in a set
since: 1.0.0
SDIFF key [key ...]
summary: Subtract multiple sets
since: 1.0.0
……
以下是 Redis-x64-3.0.504 版本的无序集合命令集:
命令 | 说明 | 版本 |
---|---|---|
SADD key member [member ...] | 向集合添加一个或多个成员 | 1.0.0+ |
SCARD key | 获取集合的成员数量 | 1.0.0+ |
SDIFF key [key ...] | 计算多个集合的差集 | 1.0.0+ |
SDIFFSTORE destination key [key ...] | 计算多个集合的差集并存储到目标键 | 1.0.0+ |
SINTER key [key ...] | 计算多个集合的交集 | 1.0.0+ |
SINTERSTORE destination key [key ...] | 计算多个集合的交集并存储到目标键 | 1.0.0+ |
SISMEMBER key member | 判断给定值是否是集合的成员 | 1.0.0+ |
SMEMBERS key | 获取集合中所有成员 | 1.0.0+ |
SMOVE source destination member | 将成员从一个集合移动到另一个集合 | 1.0.0+ |
SPOP key | 移除并返回集合中的一个随机成员 | 1.0.0+ |
SRANDMEMBER key [count] | 从集合中获取一个或多个随机成员 | 1.0.0+ |
SREM key member [member ...] | 从集合中移除一个或多个成员 | 1.0.0+ |
SSCAN key cursor [MATCH pattern][COUNT count] | 增量迭代集合元素 | 2.8.0+ |
SUNION key [key ...] | 计算多个集合的并集 | 1.0.0+ |
SUNIONSTORE destination key [key ...] | 计算多个集合的并集并存储到目标键 | 1.0.0+ |

微信公众号

QQ交流群
原创网站开发,偏差难以避免。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。