# 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交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。