1. 社交关系链的存储与查询挑战
在社交网络应用中,"共同好友"功能几乎是标配。当用户A访问用户B的个人主页时,系统需要快速计算出两人之间的共同好友关系并展示出来。这个看似简单的功能背后,隐藏着巨大的技术挑战。
传统的关系型数据库方案会使用类似如下的表结构:
sql复制CREATE TABLE user_friends (
user_id VARCHAR(32) NOT NULL,
friend_id VARCHAR(32) NOT NULL,
PRIMARY KEY (user_id, friend_id),
INDEX idx_friend_id (friend_id)
);
这种方案的查询性能会随着数据量增长急剧下降。假设平台有1000万用户,平均每人有300个好友,那么好友关系表将会有30亿条记录。在这种规模下,即使是简单的JOIN查询也会变得异常缓慢。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Redis Set数据结构的优势
Redis的Set数据结构为解决这个问题提供了完美的方案。Set是一个无序的、不重复的字符串集合,支持高效的集合运算。在社交关系场景中,我们可以为每个用户维护一个Set,存储其所有好友的ID。
2.1 Set的基本操作
bash复制# 添加好友
SADD friends:user:A userB userC userD
# 移除好友
SREM friends:user:A userD
# 获取所有好友
SMEMBERS friends:user:A
# 检查是否是好友
SISMEMBER friends:user:A userB
2.2 集合运算性能
Redis的集合运算之所以高效,主要得益于以下几个设计:
- 基于哈希表实现,查找操作时间复杂度为O(1)
- 执行集合运算时,会先比较集合大小,选择较小的集合作为遍历基准
- 所有操作都在内存中完成,避免了磁盘I/O
3. SINTERSTORE的深度解析
3.1 SINTER与SINTERSTORE的区别
SINTER key1 key2会直接返回交集结果,而SINTERSTORE destination key1 key2则将结果存储到指定的destination key中。
