Redis-python在一次操作中设置多个键/值

时间:2014-03-05 22:22:39

标签: redis redis-py

目前,我使用基本的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数据库?反之亦然,我可以在一次访问中有多个读取(get)吗? (是的 - 我有很多redis活动正在进行并且负载很重。我确实关心这个)

2 个答案:

答案 0 :(得分:15)

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次操作都可以)。

答案 1 :(得分:1)

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

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

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

  3. 您的示例可能会这样:

    cache.mset(some_dict)

    您需要为字典条目添加公共前缀:

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

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