实现以下流

时间:2015-05-22 10:44:57

标签: redis

我正在开发一个用于照片共享的应用程序并且具有关注系统,因此无论是否跟随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而不会循环播放。

1 个答案:

答案 0 :(得分:2)

这是一个简单的扇出问题,你不能轻易直接使用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

这将使用户关注者的密钥迭代。一个zset分数和值,并将这些添加到每个用户的项目。您需要更改它以满足您的确切需求。如果你想使用套装,你需要使用sscan或其他东西。 Zsets虽然有序,但更容易。