在Redis中实现参考集合

我需要在Redis中构建一个结构来模拟涉及3个实体的以下问题: 用户、节点和套接字(所有字符串ID)。 例如,用户 U1 可以使用套接字 S1 和 S2 连接到节点 N1,但也可以使用套接字 S3 和 S4 连接到节点 N2。

我必须能够轻松地更新特定用户的节点所连接的套接字,因为他连接或断开连接。 另外,每个套接字必须在一定时间内过期,如果没有任何操作,则自动过期。 在任何给定时间,我都需要知道一个用户是否连接了至少一个套接字(独立于节点)。

我使用了2种类型的集合模拟问题(我使用了哈希标记): 1- 一个键为{u:U1}skt:NX的集合,其中包含连接到节点N1的套接字,例如,对于用户U1 2- 一个键为{u:U1}skts的集合,其中包含其他集合,例如,"{u:U1}skt:N1","{u:U1}skt:N2",...

使用这个结构,我可以轻松地更新集合{u:U1}skt:NX,通过添加或删除成员。此外,我可以使用以下Lua脚本检查一个用户是否连接了一个套接字(无论节点)。

local indexes = redis.call("smembers",KEYS[1])
return redis.call("sunion",unpack(indexes))

这种方法正确吗?如何实现集合成员过期时间?

点赞
用户3160475
用户3160475

Redis 不支持数据结构内容的过期。在集合中实现过期的常见模式是使用有序集合(Sorted Sets),在元素的分值中存储时间戳或版本值。然后,过期就变成了一个简单的问题,可以使用 ZREMBYSCORE 命令删除分数低的成员。

2017-04-06 13:37:34