Redis Set天然支持无序不重复集合,适合实现关注列表与去重;通过SADD/SREM增删、SISMEMBER判断关注、SINTER求共同关注;建议结合Hash、ZSET及SCARD等提升功能与性能。

Redis 的 Set 类型天然支持无序、不重复的元素集合,非常适合实现“用户关注列表”和“去重”这类需求。Java 中通过 Redis 客户端(如 Jedis 或 Lettuce)操作 Set,能高效完成添加关注、取消关注、判断是否已关注、获取共同关注等核心功能。
关注与取关:用 SADD 和 SREM 保证唯一性
每个用户的关注列表可以用一个独立的 Set key 来存储,例如 user:1001:following 表示用户 1001 关注的人 ID 列表。
- SADD user:1001:following 2001 2002:添加用户 2001、2002 到关注列表;若其中某个 ID 已存在,Redis 自动忽略,不会重复插入 —— 这就是天然去重
- SREM user:1001:following 2001:取消关注用户 2001;不存在的 ID 也不会报错,安全可靠
- Java 示例(Jedis):jedis.sadd("user:1001:following", "2001", "2002");
判断是否已关注:用 SISMEMBER 快速查重
检查用户 A 是否关注了用户 B,只需一次 O(1) 时间复杂度的查询,比数据库查表快得多。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- SISMEMBER user:1001:following 2001 返回 1 表示已关注,0 表示未关注
- Java 示例:long isFollowed = jedis.sismember("user:1001:following", "2001") ? 1L : 0L;
- 适合用在 Feed 流、个人主页等需要实时判断关系的场景
获取互相关注与共同关注:用 SINTER 高效求交集
Set 支持集合运算,是实现社交关系分析的关键能力。
- SINTER user:1001:following user:2001:following:返回用户 1001 和 2001 共同关注的人(交集)
-
SINTER user:1001:following user:1001:followers:可计算“双向关注”(即好友),前提是你也维护了粉丝列表(
user:X:followers) - 注意:SINTER 结果是临时的,如需持久化可配合 STORE 参数写入新 key,例如 SINTERSTORE user:1001:mutual:2001 user:1001:following user:2001:following
补充建议:配合其他结构提升体验
单靠 Set 能满足基础关注逻辑,但真实业务中建议组合使用:
- 用 Hash 存用户基础信息(昵称、头像),避免每次查关注列表后还要查 DB 获取被关注人详情
- 用 Sorted Set(ZSET)按时间/热度排序关注列表(如最新关注优先),key 设为
user:1001:following:zset,score 存关注时间戳 - 关注数/粉丝数可用独立 key + INCR/DECR 维护,或用 SCARD 实时统计(SCARD user:1001:following)
- 注意设置合理过期时间(EXPIRE),对临时关系或冷数据做清理,避免内存无限增长
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










