首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >redis-py监视散列键

redis-py监视散列键
EN

Stack Overflow用户
提问于 2012-02-05 08:15:55
回答 2查看 3.8K关注 0票数 3

我使用redis-py通过python与redis交互。在这种情况下,我需要自动更新散列键,但首先需要检索该键的值,然后才能更新它。浏览一下文档,我似乎可以使用管道和WATCH命令来确定某个键何时发生了更改。有没有办法监视散列中的关键字?或者这只适用于单键?

EN

回答 2

Stack Overflow用户

发布于 2014-03-13 20:36:04

暂不支持直接查看哈希键,Redis暂不支持。但是您可以使用额外的"lock“字符串键,并定义一个约定,根据该约定,任何修改您的散列值的人都应该对任何散列键K执行以下过程

lock:K

  • HGET updated_value

  • EXEC

  1. SET lock:K ""
  2. HSET K Start保存当前值

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

虽然这是一个Python问题,但我提供了一个NodeJS函数来实现上面的契约(只是为了展示一个想法):

代码语言:javascript
复制
/**
 * 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,以便它们最终被删除。

票数 6
EN

Stack Overflow用户

发布于 2012-02-06 05:42:43

使用MULTI怎么样?这样,您就不必担心监视散列中的键(正如您所建议的,WATCH似乎不支持该键)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9145827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档