【问题标题】:Redis-python setting multiple key/values in one operationRedis-python 在一次操作中设置多个键/值
【发布时间】:2017-03-29 08:02:50
【问题描述】:

目前我使用基本的mset 功能来存储键/值;

from common.redis_client import get_redis_client
cache = get_redis_client()
for k,v in some_dict.items():
   kw = {'key': value}
   cache.mset(kw) 

#later:
   cache.get('key')

我单独存储每个键/值(例如,不在一个 json 中)因为存储整个 dict 会将其变成一个字符串,并且需要我在存储和检索时序列化/反序列化,我真的需要访问单独的键/价值观。

我的问题:: 有没有办法可以同时mset 多个键/值?而不是多次写入redis db?反之亦然,我可以在一次访问中进行多次读取(获取)吗? (是的 - 我有很多 redis 活动正在进行并且负载很重。我确实关心这个)

【问题讨论】:

    标签: redis redis-py


    【解决方案1】:

    更新在 Agis 评论后

    如果你使用Redis-py,它是目前推荐的python Redis 客户端,你可以使用流水线来做你想要的。这是一个简单的例子:

    >>> r = redis.Redis(...)
    >>> r.set('bing', 'baz')
    >>> # Use the pipeline() method to create a pipeline instance
    >>> pipe = r.pipeline()
    >>> # The following SET commands are buffered
    >>> pipe.set('foo', 'bar')
    >>> pipe.get('bing')
    >>> # the EXECUTE call sends all buffered commands to the server, returning
    >>> # a list of responses, one for each command.
    >>> pipe.execute()
    [True, 'baz']
    

    不知道你用的是哪个redis客户端,不过要么支持流水线,要么你应该考虑改用redis-py。

    看看redis documentation about pipelining;它解释说您可以期待 x5 的性能提升 - 但也不能执行太重要的批量操作(每次执行 10 000 次操作是可以的)。

    【讨论】:

    • 请注意,流水线仍会进行相同数量的写入。但是,它会为您节省往返时间:redis.io/topics/pipelining
    • 另外MULTIEXEC 是关于事务,而不是流水线。
    • 谢谢!就像集合的魅力一样 - 我如何通过管道聚合获取?它会返回一个列表吗?字典?目前我有:kw = {} for key in keys: kw[key] = redis_cache.get(key) return kw我怎么能用管道呢?
    【解决方案2】:

    由于您似乎正在寻找存储字典,我看到了另外两个可能的解决方案:

    1. 使用HMGET/HMSET 命令。这确实允许从字典中获取和设置多个单独的键。缺点是它都在一个键上,所以如果您计划单个 dict 条目的密钥过期 - 这在缓存中很常见 - 这对您不起作用。

    2. 我决定使用MGETMSET 命令。这允许一次设置多个键并同时检索它们。您已经在示例中使用了MSET(多组)命令,但只设置了一个值...

    您的示例可能会这样工作:

    cache.mset(some_dict)

    您需要为字典条目添加一个通用前缀:

    cache.mset({'prefix:' + k:v for k,v in some_dict.items()})

    通过这种方式,您将能够使用MGET 按键检索您的dict 条目。如果您事先不知道密钥,您可以在之前运行带有“prefix:*”通配符的KEYS 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      相关资源
      最近更新 更多