以下是 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 的性能和功能优势。