我正在开发一个用于照片共享的应用程序,并具有关注系统,因此无论谁关注 x 用户,x 用户的照片都会出现在他的关注中。
我将数据存储在 Redis 中,如下所示
sadd rdis_key+user_id photo_id
set redis_key+photo_id+data data_of_photo
sadd redis_key+follow+user_id follower_id
现在我想直接获取关注者的所有 photo_id,而不需要循环。
最佳答案
这是一个简单的扇出问题,无法直接使用 Redis 轻松解决。
您可以使用 Lua 来完成此操作,但在此操作过程中您将阻止 Redis。
我有一个开源项目,它做同样的事情,但我在有人创建新帖子时用代码来做。我想这就像一张新照片。
https://github.com/pjuu/pjuu/blob/master/pjuu/posts/backend.py#L252
我使用排序集,并使用 unix 时间戳作为分数,因此它们始终按顺序排列。
当 User1 创建新照片时,您会查找他们的关注者列表。如果您使用的是排序集,您可以通过以下方式获取:
followers = zrange followers:user1 0 -1
然后简单地循环该列表中的所有条目:
for follower in followers: zadd feed:user2 <timestamp> <photo_id>
这样,这个新帖子就会推送给关注 user1 的所有用户。
如果您希望动态完成此操作,那么坏消息是:您将需要一些关系数据和一种查询值的方法,但您无法执行此操作。 SQL、Mongo、Couch 等...
这只是伪代码,因为您没有提及您使用哪种语言。
编辑:根据问题,这将在 Redis 端完成
local followers = redis.call('zrange', KEYS[1], 0, -1)
for key, value in pairs(followers) do
redis.call('zadd', 'items:'..value, ARGV[1], ARGV[2])
end
return true
这将需要用户关注者的 key 进行迭代。 zset 分数和值,并将它们添加到每个用户的项目中。您将需要更改它以满足您的具体需求。如果你想使用集合,你将需要使用 sscan 或其他东西。不过,Zset 更容易且按顺序排列。
关于redis - 实现以下流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30394691/