表示'跟随' 用户2->用-6ren">
gpt4 book ai didi

redis - 如何与Redis设计 "Following"关系

转载 作者:可可西里 更新时间:2023-11-01 11:48:35 25 4
gpt4 key购买 nike

我正在尝试实现一个用户 A 关注用户 B 的场景,这样用户 A 的所有关注者也将关注用户 B。

例如:

假设我们有 4 个用户(用户:1 用户:2 用户:3 用户:4)

->表示'跟随'

用户2->用户3,用户4

新 Action :用户1->用户2

我想更新用户 2(又名用户 1)的所有关注者以关注用户 3 和用户 4:

预期结果

用户1->用户2,用户3,用户4

用户2->用户3,用户4

我需要所有用户都有这种行为

我开始考虑我的解决方案。请让我知道如何实际适应它。

我正在使用键为 [unsername]_followers 的集合。每次用户有新的关注者时,我都会检索他的关注者列表并逐个迭代代码,并通过向其中添加新用户来修改他们的列表。

问题开始变得有点复杂,因为我还需要更新关注者的关注者

代码:

requirement fact: if a follow b, b must follow a

//creating new users:

HMSET user:110 username rot
hMSET user:111 username jane
HMSET user:112 username kenny

//adding follow relations:

//user 110 started to follow user:111
sadd user:110_following user:111
sadd user:111_following user:110


//user 112 started to follow user:111
sadd user:111_following user:112
sadd user:112_following user:111


//update other "influenced" followers:

127.0.0.1:6379> smembers user:111_following
1) "user:111"
2) "user:110"
3) "user:112"

//need to update 110 (since 110 follows 111 which follow 112)
sadd user:110_following user:112

127.0.0.1:6379> smembers user:110_following
1) "user:111"
2) "user:110"
3) "user:112"

//need to update 112 (since now 110 also follows 112)
sadd user:112_following user:110

你怎么看?

谢谢,射线。

最佳答案

毕竟你的做法没问题。还是有一些问题:

  1. 不要在集合中存储 user:x(其中 x 是用户 ID),而只存储 x
  2. 使用 : 分隔符:users:11:followers
  3. 或许您也应该创建一个排序集。我想您想按某种顺序列出关注者。存储在集合和排序集合中,以便能够进行集合操作,例如交集和分页(f.e. zrange)。
  4. 当您将数据存储在多个键中时,您应该使用 multi 命令以原子方式执行此操作。
  5. 也许您想存储 JSON 对象而不是将数据存储在许多哈希中。例如:hset users 1 { "userName": "Matias"} 而不是 hset users:11 username Matias。由于您将使用 listsetsorted set 命令执行大部分操作,因此没有理由存储每个用户属性在哈希中。
  6. 不是检索应用层中的所有关注者,why don't you use sunionstore ?这样,如果您将用户 A 的关注者与用户 B 的关注者合并,并将结果存储在用户 B 的关注者中,因为它是一个集合,结果集合将只包含唯一的用户 ID。

关于redis - 如何与Redis设计 "Following"关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32306782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com