2014-03-05 46 views
5

目前我使用基本的mset功能來存儲鍵/值;Redis-python在一個操作中設置多個鍵/值

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') 

我存儲每個鍵/值separatly(不是一個JSON例如)由於存儲整個字典就會把它變成一個字符串,並要求我進行序列化/反序列化的存儲和檢索,我真的需要訪問分離鍵/值。

我的問題::有沒有一種方法我可以mset多個鍵/值一次?而不是多次寫入到redis數據庫?反之亦然可以在一個訪問中有多個讀取(get)? (是的 - 我去了很多Redis的活動上,並與重載我不關心這個。)

回答

12

阿吉斯評論後更新

如果使用Redis-py,這是目前推薦Redis的客戶端對於python,你可以使用流水線,它正是你想要的。下面是一個簡單的例子:

>>> 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的性能提升 - 但是你也不能執行太重要的批量操作(每次執行10000次操作就可以)。

+0

請注意,流水線操作仍會進行相同的寫入次數。但是它可以爲您節省往返時間:http://redis.io/topics/pipelining – Agis

+0

另外'MULTI'和'EXEC'關於* Transactions *,而不是流水線。 – Agis

+0

你說得對,我會編輯我的帖子。 –

0

既然你似乎在尋找用於存儲字典,我看到了兩個可能的解決方案:

  1. 使用HMGET/HMSET命令。這確實允許從字典中獲取和設置多個單獨的密鑰。缺點是它全部集中在一個鍵上,所以如果你計劃單個字典條目的關鍵期滿 - 就像高速緩存常見的那樣 - 這對你不起作用。

  2. 我決定使用MGETMSET命令。這允許一次設置多個鍵並且一次檢索它們。你已經在你的例子中使用的MSET(多套)的命令,但只設置一個值...

你舉的例子可能以這種方式工作:

cache.mset(some_dict)

您將要添加一個共同的前綴爲您的字典條目:

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

這樣,您就能夠RETR用鍵輸入MGET即可。如果您不知道密鑰,您可以在之前運行帶有「prefix:*」通配符的KEYS命令。