python - redis-py watch 哈希键

标签 python redis

我正在使用 redis-py 通过 python 与 redis 交互。我处于需要自动更新散列键但首先需要检索该键的值才能更新它的情况。查看文档,看起来我可以使用管道和 WATCH 命令来确定 key 何时更改。反正有没有看散列里面的 key ?还是这只适用于单键?

最佳答案

不能直接看hash key,Redis暂不支持。但是您可以使用额外的“锁定”字符串键,并定义一个合约,任何修改您的散列值的人都应该按照以下程序对任何散列键K:

  1. 观看 lock:K
  2. HGET K,保存当前值
  3. 启动 MULTI。
  4. SET lock:K ""
  5. HSET K updated_value
  6. 执行

这将保证更新后的哈希值不会被同时覆盖。

虽然这是一个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,以便它们最终被删除。

关于python - redis-py watch 哈希键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145827/

相关文章:

python - 通过代码创建 account.move - Odoo v8

django - 如何在Windows机器上用django测试 celery

redis - Stack Exchange连接到Redis集群连接错误

redis - Redis 键的命名约定和有效字符

asp.net-core - 在 asp .NET 核心中连接到特定的 Azure Redis 数据库

python - 从正在读入的文本文件中删除或删除标题

python - 将单个 python 文件与 "extras"包一起打包

python - 运行时错误: as_numpy_iterator() is not supported while tracing functions

ruby-on-rails-3 - Redis 与 Memcached 在 Heroku 上提供 JSON 服务

python - 喀拉斯 : Why does Sequential and Model give different outputs?