如何与Redis

时间:2015-08-31 08:19:00

标签: redis relationship

我正在尝试实现用户A关注用户B的场景,因此用户A的所有关注者也将关注用户B.

例如:

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

- >表示'跟随'

User2->用户3,用户4

新动作: User1->用户2

我想更新用户的所有关注者:2(也就是用户:1)跟随用户3和用户4以及:

预期结果

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

User2->用户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 个答案:

答案 0 :(得分:0)

毕竟,你的方法很好。无论如何还有一些问题:

  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。