我正在使用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. 參考哈希鍵的鏈哈希一個Perl哈希
- 6. 合併哈希鍵
- 7. 哈希鍵需要
- 8. 更改鍵「(鍵%哈希){}」 - 環
- 9. 哈希表vs哈希列表與哈希樹?
- 10. 做手工/數學哈希
- 11. Javascript測試哈希表與鍵/值
- 12. 帶兩個主鍵的哈希表
- 13. Powershell哈希表和重複鍵
- 14. Clojure的合併在哈希表鍵值
- 15. 從哈希表中讀取鍵值對
- 16. 更改特定鍵的哈希表值
- 17. 的Visual Basic哈希表圖像鍵/值
- 18. GLib哈希表 - 無法查找鍵/值
- 19. 爲什麼哈希錶店在Java中的表中的鍵的哈希值
- 20. 兩個哈希表,帶有雙鍵或不同解決方案的哈希表?
- 21. 哈希表中的搜索哈希
- 22. 哈希打印表哈希perl
- 23. 哈希表addFunction
- 24. Python哈希表
- 25. 紅寶石哈希鍵compare_by_identity
- 26. PHP哈希鍵陣列
- 27. Perl:哈希中的Grep鍵
- 28. Ruby中的哈希鍵?
- 29. 鍵值哈希EPP模板
- 30. 默認哈希鍵在Perl
你好,任何解決方案?我需要自動更新特定哈希鍵的值以及...整個哈希值可能會被監視,但競態條件會非常頻繁地發生。 – geronime 2012-10-18 21:51:40
對於單數鍵我可以通過WATCH和MULTI來完成。但我也希望在一個散列鍵中實現WATCH鍵。 – 2013-09-27 08:44:02