Redis Set集合实现好友推荐_利用SINTER寻找共同关注集合

大萱姑娘_6364

大萱姑娘_6364

2026-05-07

399人浏览

原创

能,SINTER可直接计算共同关注,但需确保所有关注列表为SET类型、key命名规范、成员格式一致;若返回空需检查类型、数据格式及写入命令是否正确。

redis set集合实现好友推荐_利用sinter寻找共同关注集合

Redis SINTER 能直接算出共同关注吗?

能,但必须确保所有用户关注列表都用 SET 存储,且 key 命名有规律(比如 user:123:follows)。SINTER 本身不关心语义,只做集合交集运算——它把传入的多个 key 当作 set,逐个取交集,返回共有的成员。如果某用户没关注任何人,对应 key 不存在或为空,SINTER 结果就是空。

常见错误现象:SINTER user:101:follows user:102:follows 返回空,但你知道他们确实都关注了 user:200。这时要检查:
• user:101:follows 和 user:102:follows 是否真为 SET 类型(用 TYPE 命令确认)
• 成员是否以字符串形式存入(比如存的是整数 200 还是字符串 "200",类型不一致会导致匹配失败)
• 是否误用了 LPUSH 或 HSET 写入,导致实际是 list 或 hash

怎么用 SINTER 推荐“可能认识的人”?

核心思路:对目标用户 A,找出他所有关注的人(比如 5 个),再对这 5 个人各自的 :follows 集合做并集(SUNION),最后剔除 A 自己已关注的、以及 A 自身 ID,剩下就是候选推荐池。但这里 SINTER 不是直接用于推荐,而是用于“找共同兴趣圈”——比如你和好友 B 都关注了 3 个相同账号,那 B 的其他关注就值得推给你。

实操建议:
• 先用 SINTER user:A:follows user:B:follows 算出共同关注数,作为亲密度权重
• 若结果 ≥ 3,再执行 SDIFF user:B:follows user:A:follows 拿到 B 独有、A 还没关注的人
• 把多个高权重好友的 SDIFF 结果用 SUNIONSTORE 合并,再用 SRANDMEMBER 随机取若干个返回
• 注意避免循环推荐:B 推 C,C 又推 B,可在合并前用 SREM 删掉当前用户已关注的所有 ID

redis-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载

性能瓶颈在哪?SINTER 大集合会卡住 Redis 吗?

会。Redis 是单线程处理命令,SINTER 时间复杂度是 O(N×M),N 是 key 个数,M 是最小集合的元素数。如果让用户 A 和 100 个好友做 SINTER,而其中最小集合有 10 万关注者,操作可能耗时数百毫秒,阻塞后续请求。

缓解方案:
• 不直接对“全部好友”计算,改用抽样:随机选 3–5 个高活跃/高相似度好友参与 SINTER
• 把高频计算结果缓存:例如 sinter:u101:u202 存 1 小时,用 EXPIRE 控制
• 改用服务端聚合:用 SCAN + 客户端内存计算替代多 key SINTER,尤其适合离线推荐任务
• 避免在主从同步延迟高的从节点上执行,SINTER 必须走 master

为什么推荐结果总是重复或冷门?

根本原因不是 SINTER 本身,而是数据建模偏差。比如只用“共同关注数”排序,没加权过滤:
• 大 V(如官方账号)被万人关注,和任意两人交集都很大,但推荐价值低 → 应提前用 SCARD 统计各关注者的粉丝量,对高频成员降权
• 新注册用户关注少,SINTER 结果为空 → 需 fallback 到标签匹配或地域推荐
• 所有 :follows 集合都未做 TTL,僵尸账号长期滞留 → 建议对超过 90 天未登录用户的 follow 集合执行 DEL

真正容易被忽略的一点:Redis 的 SINTER 返回结果无序,也不支持分页。如果一次要推荐 20 人,但 SINTER 返回 5000 个,后续还得靠客户端去重、过滤、打分、截断——这部分逻辑不能省,也不能丢给 Redis 做。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6679

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3225

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4188

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2865

10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4629

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4195

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7912

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习