python - redis:设置是否存在 - 通过 python

标签 python redis key-value-store

我有一大堆键和一个值(所有键都相同),应该将其写入 Redis 实例。仅当具有此键的条目已存在时才会发生这种情况。

MSETNX命令执行相反的操作:当键存在时,放入条目。

当然,我可以通过 EXIST 之前检查一下并根据结果设置它,但我如何确保这个atomic.由于这个列表可能非常庞大,我该如何基于管道执行此操作?

我正在使用redis-py作为包装器,并且服务器上没有可用的 Lua 脚本支持。

最佳答案

如果没有 Lua,这不是很方便,但仍然可以使用 WATCH/MULTI/EXEC 命令来完成。这个想法是将巨大的键列表划分为 n 个项目的 block (例如 n=20),然后将以下函数应用于每个 block :

def process_block( redis_client, block, value ):
    with redis_client.pipeline() as pipe:
        while True:
            try:
                pipe.watch( block )
                to_set = [ for x in block if pipe.exists(x) ]
                if to_set:
                    pipe.multi()
                    for x in to_set:
                        pipe.set( x, value )
                    pipe.execute()
                break
            except redis.WatchError:
                continue
            finally:
                pipe.reset()

原子性由 WATCH/MULTI/EXEC 命令保证,您将管道化 1 个 WATCH、1 个 MULTI、最多 n 个 SET 和 1 个 EXEC 命令。不过,您将支付 EXISTS 往返费用。选择正确的 n 值是管道因素和并发交互风险之间的权衡。不宜设置太高。

关于python - redis:设置是否存在 - 通过 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11828757/

相关文章:

python - 比较特定列的 70% 的行

python - l.strip() 在此语句中的作用是什么

javascript - Express 没有找到它期望的 redis 结果

cassandra - 键值存储的优点是什么?

python - 没有客户端/服务器的 key : value store in Python for possibly 100 GB of data,

java - 用于 Java 的单文件、持久、排序的键值存储(替代 Berkeley DB)

python - 在基类中使用派生类的属性

python - 在 Windows 7 中使用 pip 安装 pywin32 在 python 3.4.2 中不起作用

从 Redis HGETALL 调用返回高效字典的 Lua 脚本

redis - 如何正确计算 hash-max-ziplist-value?