15

目前我使用基本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 活动正在进行并且负载很重。我确实关心这个)

4

2 回答 2

26

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 文档;它解释说您可以期待 x5 的性能提升 - 但也不能执行太重要的批量操作(每次执行 10 000 次操作是可以的)。

于 2014-03-05T22:59:52.583 回答
7

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

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

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

您的示例可能以这种方式工作:

cache.mset(some_dict)

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

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

这样,您将能够MGET通过键检索您的 dict 条目。如果您事先不知道密钥,则可以先运行KEYS带有“前缀:*”通配符的命令。

于 2015-12-06T11:07:50.930 回答