以下是 Redis 中 Set 和 ZSet 的详细对比,涵盖定义、特性、命令、适用场景及总结表格:
1. 核心定义
数据类型 | Set | ZSet(Sorted Set) |
---|
定义 | 无序的、唯一的字符串集合,元素不重复。 | 有序的、唯一的字符串集合,每个元素关联一个 分数(score),按分数排序。 |
2. 核心特性对比
2.1 共同点
- 元素唯一性:相同元素无法重复添加。
- 存储结构:底层基于哈希表实现。
- 集合运算:支持交集、并集、差集操作(如
SINTER
、ZINTERSTORE
)。
2.2 不同点
特性 | Set | ZSet |
---|
元素排序 | 无序(插入顺序不保证)。 | 按 分数(score) 排序(从小到大默认)。 |
元素与分数关联 | 无分数,仅存储元素值。 | 每个元素必须关联一个分数(double 类型)。 |
范围查询 | 无法直接按范围查询元素。 | 可通过分数范围(ZRANGEBYSCORE )或索引范围(ZRANGE )查询元素。 |
更新操作 | 仅能通过 SADD 添加或 SREM 删除元素。 | 可通过 ZADD 修改元素的分数,从而改变其排序位置。 |
存储空间 | 仅存储元素值。 | 需额外存储元素值和分数,空间占用略高。 |
3. 常用命令对比
3.1 Set 常用命令
命令 | 功能 | 示例 |
---|
SADD key member | 添加元素到集合。 | SADD tags "spring" "redis" |
SMEMBERS key | 获取集合所有元素。 | SMEMBERS tags → 输出 ["spring", "redis"] |
SISMEMBER key member | 判断元素是否存在于集合。 | SISMEMBER tags "spring" → 返回 1 (存在)。 |
SINTER key1 key2 | 计算两个集合的交集。 | SINTER tags other_tags → 输出共同元素。 |
3.2 ZSet 常用命令
命令 | 功能 | 示例 |
---|
ZADD key score member | 添加元素并设置分数。 | ZADD leaderboard 90 Alice 85 Bob → Alice 分数 90,Bob 分数 85。 |
ZRANGE key start stop | 获取指定索引范围的元素(按分数升序)。 | ZRANGE leaderboard 0 -1 → 输出 ["Bob", "Alice"] (按分数升序)。 |
ZREVRANGE key start stop | 获取指定索引范围的元素(按分数降序)。 | ZREVRANGE leaderboard 0 -1 → 输出 ["Alice", "Bob"] 。 |
ZRANGEBYSCORE key min max | 获取指定分数范围的元素。 | ZRANGEBYSCORE leaderboard 80 90 → 输出分数在 80-90 之间的元素。 |
ZREM key member | 删除指定元素。 | ZREM leaderboard Alice → 移除 Alice。 |
4. 适用场景对比
4.1 Set 的典型场景
- 去重:存储唯一元素(如用户标签、已访问 URL)。
- 集合运算:计算多个集合的交集、并集(如共同好友、共同兴趣)。
- 快速存在性判断:检查元素是否已存在(如防止重复提交)。
4.2 ZSet 的典型场景
- 排行榜:按分数排序(如积分排名、销量排名)。
- 优先级队列:分数表示优先级,按分数提取元素(如任务调度)。
- 带时间戳的队列:分数设为时间戳,实现按时间排序的队列。
5. 总结表格
对比维度 | Set | ZSet |
---|
排序 | 无序(插入顺序不保证)。 | 按分数排序(升序或降序)。 |
元素与分数 | 无分数,仅存储值。 | 每个元素关联一个分数(double 类型)。 |
范围查询 | 不支持分数/索引范围查询。 | 支持按分数范围(ZRANGEBYSCORE )或索引范围(ZRANGE )查询。 |
更新操作 | 无法直接修改元素(只能删除后重新添加)。 | 可通过修改分数调整元素位置。 |
适用场景 | 去重、集合运算、存在性判断。 | 排行榜、优先级队列、带权重的有序数据。 |
存储空间 | 仅存储元素值。 | 需额外存储元素值和分数,空间略高。 |
6. 选择建议
-
选 Set 的场景:
- 需要存储唯一元素且无需排序。
- 需要快速判断元素是否存在。
- 需要集合运算(如交集、并集)。
-
选 ZSet 的场景:
- 需要元素按分数排序(如排行榜)。
- 需要动态调整元素的优先级(如任务队列)。
- 需要按分数范围查询元素(如筛选高分用户)。
通过合理选择,可以最大化 Redis 的性能和功能优势。