社交圈数据结构设计(redis实现)

本文介绍了一种游戏社交系统的实现方案,包括玩家信息管理、消息传递、动态发布等功能,并详细阐述了如何通过合理的设计来提高玩家之间的互动性和活跃度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.player_simple_info pid pid|level|profile_url|name    ----------------hash      
2.player_detail_info:12345 pid 12345 name kaka guild_id 123 visit_count 100000 gift_count 100 desc 最伟大的人      -----------------hash
3.player_friend_list:12345 pid1 pid2 pid3   -------------------------- set
4.player_fan_list:12345 pid1 pid2 pid3 ------------------------ set 
5.player_active_info  pid1 time1  pid2 time2 ----------------------- hash
4.msg_info:mid 12345|time|msg  ---------------------- string
5.msg_list:12345 time1 mid1 time2 mid2        ------------------sorted set
拉取消息时,可以分页拉取,然后mget msg info。拉取到每条消息的pid,然后hmget player simple info
6.feed_info:fid  12345|comment_count|like_count|content    --------------------string
fid自增产生
7.feed_self_list:12345 time1 fid1 time2 fid2  -------------sorted set
玩家自己发的feed需要push_back一个feed id,这个feed list作为拉模式生成feed_show_list
8.feed_show_list:12345 10002 10002   10003 10003  -------------sorted set
拉取feed时,可以分页, 先拉取到fid列表,然后mget feed_info
9.feed_like_list:fid  time pid     --------------sorted set
zadd feed_like_list:fid 1422222222 12345, 增删效率都比较高
10.feed_comment_list:fid   time1 cid1  time2 cid2 time3 cid3 -------------------------sorted set
可以分页,mget  time是1861920000除了最高位,861920000 * 100, 如果对这个评论回复一条,就time11就是time1+1
11.feed_comment_info:cid  pid|time|for_fid/for_cid|target_id|content  -------string
评论要标识是对feed的评论还是回复评论,对消息的评论也只是产生一个feed的评论,跟在之前的评论后面
sharding策略:
1.player_detail_info数据量最大,而且不会有mget操作,所以适合做sharding
2.player_simple_info在msg列表或者是feed列表都需要展示出来,所以会有大量的mget操作,如果做了sharding,一个玩家的好友或者被关注可能涉及到多个db的查询操作,效率会降低;同时simple info的数据量很小,比较可控。
3.msg_id要通过自增生成,msg要设置过期时间,拉取msg_list只get一个月内的数据,对于之外的数据,可以在空闲时删除;拉取时分页拉取
4.feed_id要通过自增生成,feed也要设置过期时间,自己发的feed存在feed_self_list中,自己空间的最新feed要从feed_show_list拉取。
1)玩家A发一条feed,需要同时zadd feed_self_list:A和feed_show_list:A
2) 玩家发一条feed,拉取player_fan_list,从player_active_info中hmget各个玩家的活跃时间,去最近活跃的玩家(e.g. 12345),然后分别zadd fid到feed_show_list:12345   --------推模式
5.查看玩家A的主页feed信息, 查看feed_show_list:A是否存在,如果存在直接分页拉取,如果不存在,将收集每个好友(包括自己)的feed_self_list的前30条,然后push到feed_show_list中,设置feed_show_list的过期时间为1天,然后分页拉取
6.定期清理历史数据,比如没有好友的玩家,msg_info和feed_info都要做expire,同时msg_list和feed_list都要删除不需要的历史数据
master有三个实例:
1.detail_info_db做sharding
2.simple_info不做sharding,可以做slave级联
3.msg_feed不做sharding,可以做slave级联
msg_feed的写入在master,查询可以在任意slave
### Redis 支持的五种数据结构 #### String 类型 String 是最简单的类型,可以看作是一个字符串或者二进制安全的字节序列。除了存储简单字符串外,还可以用于计数器等场景。 ```python SET key value # 设置指定 key 的值 GET key # 获取指定 key 的值 INCR key # 将 key 中储存的数字值增一 DECR key # 将 key 中储存的数字值减一 ``` 对于对象类数据而言,在有频繁更新需求的情况下,直接使用 string 存储整个 JSON 或者其他形式的对象串确实不够灵活[^1]。 #### Hash 类型 Hash 数据类型允许对一系列字段进行分组管理,适合用来表示对象属性。内部通过 field-value 形式的键值对来组织数据,其中 field 和 value 都是字符串类型的。 ```python HSET user:1 name "Alice" # 向哈希表 user:1 中设置域 name 的值为 Alice HMSET user:2 age 28 city Beijing # 同时向多个字段赋值 HGETALL user:1 # 获取哈希表中所有的字段和值 ``` 这种设计使得 hash 成为了处理复杂对象的理想选择之一。 #### List 类型 List 表现为双向链表的形式,意味着可以从两端高效地插入或移除元素。适用于消息队列之类的场合。 ```python LPUSH mylist "world" # 在列表头部添加元素 RPUSH mylist "hello" # 在列表尾部添加元素 LRANGE mylist 0 -1 # 输出整个列表的内容 LPOP mylist # 移除并返回列表的第一个元素 RPOP mylist # 移除并返回列表最后一个元素 ``` 不过需要注意的是,当需要确保唯一性的时候,则应该考虑采用 set 来代替 list[^2]。 #### Set 类型 Set 实际上是一群独一无二的字符组成的集合,不允许重复项的存在。由于其特性非常适合做去重工作,并且提供了丰富的集合运算指令如交集、并集、差集等操作。 ```python SADD unique_set item1 # 添加新成员到集合里 SMEMBERS unique_set # 列举出所有成员 SCARD unique_set # 查看集合大小 SISMEMBER unique_set member # 测试某元素是否属于该集合 SINTER setA setB # 计算两个集合之间的交集 ``` 这些功能让 set 特别适合作为代表社交网络关系模型中的好友圈或者其他关联群体的关系表达工具[^4]。 #### Sorted Set (Zset) 类型 Sorted Set 不仅具备 set 的特点——即不会出现相同的分数对应不同的成员的情况;而且还能按照 score 排序,这使其能够轻松构建排行榜之类的应用程序逻辑。 ```python ZADD leaderboard 95.5 player1 # 给定分数给玩家排名 ZRANK leaderboard player1 # 查询特定用户的排名位置 ZSCORE leaderboard player1 # 得知具体得分情况 ZRANGEBYSCORE leaderboard min max # 根据分数范围获取区间内的用户名单 ``` 综上所述,每一种数据结构都有各自的优势领域,合理选用才能发挥最大效能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值