我正在使用redis-py通过python与redis进行接口。我处于这种情况,我需要自动更新散列键,但首先需要检索该键的值,然后才能更新它。通过文档查看,我可以使用管道和WATCH命令来确定密钥何时发生更改。无论如何要看一个哈希密钥?或者这只适用于单数键?redis-py手表哈希键
3
A
回答
0
1
您不能直接观看哈希键,目前Redis不支持这种方式。但是你可以使用额外的“锁定”字符串键,并定义了合同,由任何人,谁修改您的哈希值,应遵循以下任何散列键K
的过程:
- WATCH
lock:K
- HGETķ ,保存当前值
- 启动MULTI。
- SET
lock:K
“” - HSETķupdated_value
- EXEC
这将保证更新的散列值不同时覆盖。
虽然这是一个Python的问题,我公司提供的NodeJS功能实现上述合同(只显示一个想法):
/**
* Concurrently updates Redis string and hash value under the specified key.
*
* @param redisCli Redis client.
* @param hashName Hash name.
* @param objId Object ID.
* @param transFun Cache object transformation function (i.e. a modification that we need to apply).
* @param cbFun Callback function, to which a modified object is passed in case of success.
*/
exports.redisUpdateHashConcurrently = function(redisCli, hashName, objId, transFun, cbFun) {
var lockKey = hashName + ':' + objId + ':lock';
redisCli.watch(lockKey); // Step 1.
redisCli.hget(hashName, objId, function(err, obj) { // Step 2.
if (err) {
redisCli.unwatch();
cbFun && cbFun(undefined, err);
return;
}
if (obj) {
var modObj = transFun(JSON.parse(obj));
var value = JSON.stringify(modObj);
redisCli.multi() // Step 3.
.set(lockKey, '') // Step 4.
.expire(lockKey, 3)
.hset(hashName, objId, value) // Step 5.
.exec(function(err, replies) { // Step 6.
if (!replies) { // Object was modified by someone else, retry.
exports.redisUpdateHashConcurrently(redisCli, hashName, objId, transFun, cbFun);
}
else { // We have succeeded.
cbFun && cbFun(modObj, undefined);
}
});
}
else {
redisCli.unwatch();
}
});
};
请注意,您可以为“锁定”键指定TTL,以便它们最终被移除。
相关问题
- 1. 多键哈希表(unordered_map)
- 2. 哈希表键语法来引用嵌入哈希表元素
- 3. 使用SQL查询结果中的主键创建哈希表的哈希表作为哈希表键值
- 4. 嵌套哈希排序哈希键
- 5. 合并哈希键
- 6. 哈希键需要
- 7. 更改键“(键%哈希){}” - 环
- 8. 哈希表vs哈希列表与哈希树?
- 9. 做手工/数学哈希
- 10. Powershell哈希表和重复键
- 11. 带两个主键的哈希表
- 12. Javascript测试哈希表与键/值
- 13. Clojure的合并在哈希表键值
- 14. 从哈希表中读取键值对
- 15. 两个哈希表,带有双键或不同解决方案的哈希表?
- 16. 哈希表中的搜索哈希
- 17. 哈希打印表哈希perl
- 18. 哈希映射对象键
- 19. 键值哈希EPP模板
- 20. 验证哈希键/值
- 21. 默认哈希键在Perl
- 22. 如何创建哈希键
- 23. Perl:哈希中的Grep键
- 24. 完整的哈希键
- 25. CoffeeScript的动态哈希键
- 26. 如何在matlab中使用坐标作为哈希键来构建哈希表?
- 27. 创建一个整数和值为整数的哈希集键的哈希表
- 28. 使哈希键与哈希常数的顺序匹配
- 29. 考虑单个哈希键值合并哈希阵列
- 30. 确定双哈希函数给定键 - >哈希位置值
你好,任何解决方案?我需要自动更新特定哈希键的值以及...整个哈希值可能会被监视,但竞态条件会非常频繁地发生。 – geronime 2012-10-18 21:51:40
对于单数键我可以通过WATCH和MULTI来完成。但我也希望在一个散列键中实现WATCH键。 – 2013-09-27 08:44:02