我正在使用 redis-py 通过 python 与 redis 交互。我处于需要自动更新哈希键但首先需要检索该键的值才能更新它的情况。查看文档,我似乎可以使用管道和 WATCH 命令来确定密钥何时发生更改。反正有没有看散列中的键?或者这仅适用于单键?
您不能直接查看哈希键,Redis 目前不支持。但是您可以使用额外的“锁定”字符串键,并定义一个合同,通过该合同,修改您的哈希值的任何人都应按照以下程序对任何哈希键进行操作K:
lock:Klock:K“”这将保证更新后的哈希值不会同时被覆盖。
虽然这是一个 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();
}
});
};
Run Code Online (Sandbox Code Playgroud)
请注意,您可以为“锁定”键指定 TTL,以便它们最终被删除。
| 归档时间: |
|
| 查看次数: |
3590 次 |
| 最近记录: |