Redis 实现以下流

Redis 实现以下流,redis,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 现在,我想直接获取追随者的所有照片id,而无需循环。这是一个简单的扇出问题,您无法直接使用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

现在,我想直接获取追随者的所有照片id,而无需循环。

这是一个简单的扇出问题,您无法直接使用Redis轻松解决

您可以使用Lua执行此操作,但会在操作期间阻止Redis

我有一个开源项目,它做同样的事情,但我在别人创建新帖子时用代码来做。我想这就像一张新照片

不过,我使用排序集,并使用unix时间戳作为分数,因此它们总是有序的

当User1创建一张新照片时,您将查找其追随者的列表。如果您使用的是排序集,则可以通过以下方式获得:

followers=zrange followers:user1 0-1

然后简单地循环该列表中的所有条目:

关注者中的关注者:zadd提要:user2

通过这种方式,这篇新文章现在被推送给所有关注user1的用户

如果您希望即时完成这项工作,那么坏消息是:您将需要一些关系数据和一种查询无法执行的值的方法。SQL、Mongo、Coach等

这只是伪代码,因为您没有提到使用哪种语言

编辑:根据问题,这将在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或其他东西。但是,zset更容易,而且更有序。

您在照片的数据中存储了什么?您认为使用
Redis
作为应用程序的数据存储是一个好主意吗?考虑MunGDB及其::)N9CODE,我知道我可以在MangoDB中存储数据,但这不是问题。我怎样才能得到追随者的照片。这就是我想说的。redis的问题是您无法在那里进行查询。你可以选择Lua或者在客户端实现你的查询。我正在使用Lua,但是我必须对所有关注者进行循环,并获取他们的照片id。我不想要的是,redis有什么存在吗。这就是我要问的。我不认为没有Redis中的循环就有可能实现你的目标。请看我以前的评论。我不想要它。循环使它变慢。当我在电脑前,我会发布一个lua版本。它可能会慢一些,但如果在这段时间内有更多用户尝试执行其他命令,那么长时间阻止Redis将使它看起来更慢。如果不一定是即时的,你可以把扇出的时间推迟到一个工人身上,这样就不会阻塞任何东西。我已经添加了一个Lua示例,说明你可以做什么。非常感谢。但我现在也在做同样的事情,但速度很慢。我计划转移到流框架。