从Redis获取密钥并同时使其过期

时间:2015-06-14 14:47:00

标签: node.js redis

我有一个由Redis备份的Queue,有多个节点连接到Redis服务器,我需要确保它不会获得相同的密钥两次,所以它永远不会运行任务不止一次。

我使用node-redis执行此任务:

client.set("some_key", data);
client.get("some_key", function (err, data) {
    //.. 
});

如何确保获取该密钥时其他任何节点进程都无法获取该密钥?如果我将它设置为已过期,只有在获得该值后,当2进程尝试同时获得相同的值时,它才足够。

3 个答案:

答案 0 :(得分:3)

我认为除了将它包装在MULTI中之外还有其他任何方式

MULTI
GET some_key
DEL some_key
EXEC

所以使用node-redis,比如

 client.multi()
.get("some_key", data).del("some_key").
.exec(function (err, replies) {});

答案 1 :(得分:1)

您可以使用MULTI / EXEC块和/或Lua脚本确保Redis中的操作的原子性。在您的情况下,您可以使用上述任一方法立即执行GET后跟DEL以确保单次读取。

答案 2 :(得分:1)

我会使用带弹出操作的列表而不是键。特别是,您可以将新项目添加到右侧(通过rpush),然后将其从左侧弹出(通过LPOP)。

如果您正在存储一堆当前密钥中的数据(例如散列),则使用唯一标识符作为散列的密钥,并将该ID添加到列表中。这样,您可以以简单的方式获得get-and-remove功能,而无需事务和多个命令以及存储作业数据的能力。

当作业成功删除数据密钥时,如果失败则可以重新排队。