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

现在我想直接获取关注者的所有 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/

相关文章:

redis - 开源内存和持久分布式时间序列数据库

redis - 如何备份 Redis 服务器的 RDB 和 AOF 文件进行恢复,以确保最小的数据丢失?

redis - 分布式计算 : Cache user based messages for x minutes and then persist

node.js - 库 - TypeError : Cannot read property 'zcard' of null

mongodb - 关于Morphia版本(乐观锁)

mysql - 使用 Nginx 代理 TCP 流(MySQL 和 Redis)

groovy - 如何用jmeter对redis进行基准测试?

.net - 如何让 SignalR 订阅 Redis channel ?

nginx - 使用 Nginx 与 Redis 进行缓存、使用 Nginx 进行代理和负载平衡

ruby - 如何清除redis集群节点的重定向键