2015-06-14 37 views
0

我有一个由Redis备份的队列,并且有多个节点连接到该Redis服务器,并且我需要确保它不会获得相同的密钥两次,所以它永远不会多次运行同一个任务。从Redis获取密钥并同时到期

我使用节点Redis的这个任务:

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

得到那个关键的是没有其他节点的过程就能得到它太当我如何确保?如果我只在获得该值后将其设置为过期,那么当2个进程将尝试同时获得相同的值时,它将不够用。

回答

3

我不认为还有比因此,使用节点的Redis来包装它在多

MULTI 
GET some_key 
DEL some_key 
EXEC 

任何其他方式,像

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

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

1

我会使用一个列表与流行操作而不是一个关键。尤其是,您可以向右侧添加新项目(通过rpush),并将其从左侧弹出(通过LPOP)。

如果您正在存储大量密钥(如果当前密钥中的数据(如哈希))使用唯一标识符作为哈希键,并将该ID添加到列表中,通过这种方式,您可以以简单的方式获得get-and-remove功能,而无需事务和多个命令,并且还可以存储作业数据。

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

+0

我并不熟悉LPOP/RPUSH,它听起来像是我想用的方法。谢谢。 – Dano