由官方文檔而得
python 利用 redis 第三方庫
首先安裝
pip install redis
然后就可以開始愉快地使用了
import redis
r = redis.StricRedis(host='localhost', port=6379, db=0)
r.set('test', '1')
r.get('test') # ->> '1'
注讶泰,r 方法一覽:
默認情況下,響應(yīng)以 Python3 的字節(jié)Python 2 的 str 形式返回,用戶負責(zé)解碼操作平夜。
redis-py 實現(xiàn)了兩個類來操作 redis
-
StricRedis
盡量堅持官方語法,除了以下命令:-
select
沒有實現(xiàn),考慮到了線程安全 -
del
Python 關(guān)鍵字粟瞬,用delete
代替 -
config get|se
作為config_get / config_set
實現(xiàn) -
multi / exec
作為Pipeline
類的一部分實現(xiàn)的。
-
-
Redis
類是StricRedis
的子類萤捆,提供向后的兼容性裙品。推薦使用StricRedis
。Redis 覆蓋了幾個命令:-
lrem
num 和 value 參數(shù)順序顛倒俗或,num 提供默認值 0 -
zadd
Redis類期望* args的形式為:name1市怎,score1,name2辛慰,score2区匠,...
,而 StricRedis 是score1帅腌,name1驰弄,score2,name2速客,...
戚篙,這與 Redis 一樣。 -
setex
time 和 value 順序顛倒溺职。在 Redis 類中是:setex(key, value, time)
岔擂,在 StricRedis 類中是:setex(key, time, value)
。
-
連接池來操作
pool = redis.ConnectionPool(host = ' localhost '浪耘,port = 6379智亮,db = 0)
r = redis.Redis(connection_pool = pool)
解析器
可以使用 Redis 官方維護的一個 C 庫 hiredis
pip install hiredis
線程安全
可以在線程之間安全地共享 Redis 客戶端實例。有一點需要注意:Redis SELECT命令点待。SELECT命令允許您切換連接當前使用的數(shù)據(jù)庫阔蛉。該數(shù)據(jù)庫保持選定狀態(tài)直到選擇另一個數(shù)據(jù)庫或連接關(guān)閉。這會產(chǎn)生一個問題癞埠,即連接可以返回到連接到不同數(shù)據(jù)庫的池状原。因此不會實現(xiàn) select 命令聋呢。
在線程之間傳遞PubSub或Pipeline對象是不安全的。
管道
一般用來執(zhí)行事務(wù)操作
>>> 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']
也可以進行鏈式操作
>>> pipe.set(' foo '颠区,' bar ').sadd(' faz '削锰,' baz ').incr(' auto_number ')。execute()
[True毕莱,True器贩,6]
禁用原子性:
pipe = r.pipeline(transaction = False)
WATCH 監(jiān)控命令:
>>> with r.pipeline() as pipe:
... while 1:
... try:
... # 設(shè)置一個 watch
... pipe.watch('OUR-SEQUENCE-KEY')
... current_value = pipe.get('OUR-SEQUENCE-KEY')
... next_value = int(current_value) + 1
... # 開始事務(wù)
... pipe.multi()
... pipe.set('OUR-SEQUENCE-KEY', next_value)
... # 執(zhí)行
... pipe.execute()
... # 如果拋出 WatchError ,表示原子性失敗
... break
... except WatchError:
... # 另一個客戶端修改了朋截,我們必須重試
... continue
由于 Pipeline 在 watch 期間綁定到單個連接蛹稍,必須調(diào)用 reset() 來確保返回連接池,使用 with 上下文的話部服,它會自動調(diào)用唆姐。當然也可以手動調(diào)用:
>>> pipe = r.pipeline()
>>> while 1:
... try:
... pipe.watch('OUR-SEQUENCE-KEY')
... ...
... pipe.execute()
... break
... except WatchError:
... continue
... finally:
... pipe.reset()
也可以使用 transaction() 方法來簡化操作
>>> def client_side_incr(pipe):
... current_value = pipe.get('OUR-SEQUENCE-KEY')
... next_value = int(current_value) + 1
... pipe.multi()
... pipe.set('OUR-SEQUENCE-KEY', next_value)
>>>
>>> r.transaction(client_side_incr, 'OUR-SEQUENCE-KEY')
[True]
注:訂閱發(fā)布模式還沒有詳細理解,故沒寫廓八,以后用到了會寫奉芦。
迭代器
>>> for key, value in (('A', '1'), ('B', '2'), ('C', '3')):
... r.set(key, value)
>>> for key in r.scan_iter():
... print key, r.get(key)
A 1
B 2
C 3