亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

Redis的Python客戶端redis-py安裝使用說明文檔

2020-10-28 21:40:49
字體:
來源:轉載
供稿:網友

1.安裝

redis-py是Redis key-value 數據庫的 Python 接口,安裝如下,后面我們會講hiredis這個庫

復制代碼 代碼如下:

$ sudo pip install redis
$ sudo pip install hiredis

2.入門

復制代碼 代碼如下:

>>> import redis

>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

>>> r = redis.StrictRedis(connection_pool = pool)

>>> r.set('foo', 'bar')

True

>>> r.get('foo')

'bar'

3.API參考

Redis 官方文檔詳細解釋了每個命令(http://redis.io/commands)。redis-py 提供了兩個實現這些命令的客戶端類。StrictRedis 類試圖遵守官方的命令語法,但也有幾點例外:

?SELECT:沒有實現。參見下面“線程安全”部分的解釋。

?DEL:'del' 是 Python 語法的保留關鍵字。因此redis-py 使用 “delete” 代替。

?CONFIG GET|SET:分別用 config_get 和 config_set 實現。

?MULTI/EXEC:作為 Pipeline 類的一部分來實現。若在調用pipeline 方法時指定use_transaction=True,在執行 pipeline 時會用 MULTI 和 EXEC 封裝 pipeline 的操作。參見下面 Pipeline 部分。

?SUBSCRIBE/LISTEN: 和 pipeline 類似,由于需要下層的連接保持狀態, PubSub 也實現成單獨的類。調用 Redis 客戶端的 pubsub 方法返回一個 PubSub 的實例,通過這個實例可以訂閱頻道或偵聽消息。兩個類(StrictRedis 和 PubSub 類)都可以發布(PUBLISH)消息。

除了上面的改變,StrictRedis 的子類 Redis,提供了對舊版本 redis-py 的兼容:

?LREM:參數 ‘num' 和 ‘value' 的順序交換了一下,這樣‘num' 可以提供缺省值 0.

?ZADD:實現時 score 和 value 的順序不小心弄反了,后來有人用了,就這樣了

?SETEX: time 和 value 的順序反了

注:最好不要用 Redis,這個類只是做兼容用的

4.詳細說明

4.1 連接池

在后臺,redis-py 采用了連接池(ConnectionPool)來管理對 Redis 服務器的連接。缺省情況下,每個Redis 實例都創建自己的連接池。也可以采用向 Redis 類的 connection_pool 參數傳遞已創建的連接池的方式。通過這種方式,可以實現客戶端分片或精確控制連接的管理:

復制代碼 代碼如下:

>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0)

>>> r = redis.StrictRedis(connection_pool=pool)


4.2 連接

ConnectionPool 管理一組 Connection 實例。redis-py 提供兩種類型的 Connection。缺省情況下,Connection 是一個普通的 TCP 連接。 UnixDomainSocketConnection 允許和服務器運行在同一個設備上的客戶端通過 unix 套接字進行連接。要使用 UnixDomainSocketConnection 連接, 只需要通過unix_socket_path 參數傳遞一個 unix 套接字文件的字符串。另外,確保redis.conf 文件配置了unixsocket 參數(缺省情況下是注釋掉的):

復制代碼 代碼如下:

>>> r = redis.StrictRedis(unix_socket_path='/tmp/redis.sock')

也可以自己創建 Connection 子類。這個特性可以在使用異步框架時用于控制 socket 的行為。要使用自己的Connection 初始化客戶端類,需要創建一個連接池,通 connection_class 參數把自己的類傳遞進去。傳遞的其它關鍵字參數會在初始化時傳遞給自定義的類:
復制代碼 代碼如下:

>>> pool = redis.ConnectionPool(connection_class=YourConnectionClass, your_arg='...', ...)

4.3 分析器

分析類提供了控制如何對 Redis 服務器的響應進行分析的途徑。redis-py 提供了兩個分析類, PythonParser和 HiredisParser。缺省情況下,如果安裝了 hiredis 模塊, redis-py 會嘗試使用 HiredisParser,否則使用 PythonParser。

Hiredis 是由 Redis 核心團隊維護的 C 庫。 Pieter Noordhuis 創建了 Python 的實現。分析 Redis 服務器的響應時,Hiredis 可以提供 10 倍的速度提升。性能提升在獲取大量數據時優為明顯,比如 LRANGE 和SMEMBERS 操作。

和 redis-py 一樣,Hiredis 在 Pypi 中就有,可以通過 pip 或 easy_install 安裝:

復制代碼 代碼如下:

$ pip install hiredis

或:
復制代碼 代碼如下:

$ easy_install hiredis

4.4 響應回調函數

客戶端類使用一系列回調函數來把 Redis 響應轉換成合適的 Python 類型。有些回調函數在 Redis 客戶端類的字典 RESPONSE_CALLBACKS 中定義。

通過 set_response_callback 方法可以把自定義的回調函數添加到單個實例。這個方法接受兩個參數:一個命令名和一個回調函數。通過這種方法添加的回調函數只對添加到的對象有效。要想全局定義或重載一個回調函數,應該創建 Redis 客戶端的子類并把回調函數添加到類的 RESPONSE_CALLBACKS(原文誤為REDIS_CALLBACKS) 中。

響應回調函數至少有一個參數:Redis 服務器的響應。要進一步控制如何解釋響應,也可以使用關鍵字參數。這些關鍵字參數在對 execute_command 的命令調用時指定。通過 “withscores” 參數,ZRANGE 演示了回調函數如何使用關鍵字參數。

4.5 線程安全

Redis 客戶端實例可以安全地在線程間共享。從內部實現來說,只有在命令執行時才獲取連接實例,完成后直接返回連接池,命令永不修改客戶端實例的狀態。

但是,有一點需要注意:SELECT 命令。SELECT 命令允許切換當前連接使用的數據庫。新的數據庫保持被選中狀態,直到選中另一個數據庫或連接關閉。這會導致在返回連接池時,連接可能指定了別的數據庫。

因此,redis-py 沒有在客戶端實例中實現 SELECT 命令。如果要在同一個應用中使用多個 Redis 數據庫,應該給第一個數據庫創建獨立的客戶端實例(可能也需要獨立的連接池)。

在線程間傳遞 PubSub 和 Pipeline 對象是不安全的。

4.6 Pipeline

Pipeline 是 StrictRedis 類的子類,支持在一個請求里發送緩沖的多個命令。通過減少客戶端和服務器之間往來的數據包,可以大大提高命令組的性能。

Pipeline 的使用非常簡單:

復制代碼 代碼如下:

>>> 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 bufferred commands to the server, returning

>>> # a list of responses, one for each command.

>>> pipe.execute()

[True, 'baz']

為了方便使用,所有緩沖到 pipeline 的命令返回 pipeline 對象本身。因此調用可以鏈起來:

復制代碼 代碼如下:

>>> pipe.set('foo', 'bar').sadd('faz', 'baz').incr('auto_number').execute()

[True, True, 6]


另外,pipeline 也可以保證緩沖的命令組做為一個原子操作。缺省就是這種模式。要使用命令緩沖,但禁止pipeline 的原子操作屬性,可以關掉 transaction:

>>> pipe = r.pipeline(transaction=False)
一個常見的問題是:在進行原子事務操作前需要從 Redis 中獲取事務中要用的數據。比如,假設 INCR 命令不存在,但我們需要用 Python 創建一個原子版本的 INCR。

一個不成熟的實現是獲取值(GET),在 Python 中增一, 設置(SET)新值。但是,這不是原子操作,因為多個客戶端可能在同一時間做這件事,每一個都通過 GET 獲取同一個值。

WATCH 命令提供了在開始事務前監視一個或多個鍵的能力。如果這些鍵中的任何一個在執行事務前發生改變,整個事務就會被取消并拋出 WatchError 異常。要實現我們的客戶 INCR 命令,可以按下面的方法操作:

復制代碼 代碼如下:

>>> with r.pipeline() as pipe:

...     while 1:

...         try:

...             # 對序列號的鍵進行 WATCH

...             pipe.watch('OUR-SEQUENCE-KEY')

...             # WATCH 執行后,pipeline 被設置成立即執行模式直到我們通知它

...             # 重新開始緩沖命令。

...             # 這就允許我們獲取序列號的值

...             current_value = pipe.get('OUR-SEQUENCE-KEY')

...             next_value = unicode(int(current_value) + 1)

...             # 現在我們可以用 MULTI 命令把 pipeline 設置成緩沖模式

...             pipe.multi()

...             pipe.set('OUR-SEQUENCE-KEY', next_value)

...             # 最后,執行 pipeline (set 命令)

...             pipe.execute()

...             # 如果執行時沒有拋出 WatchError,我們剛才所做的確實“原子地”

...             # 完成了

...             break

...         except WatchError:

...             # 一定是其它客戶端在我們開始 WATCH 和執行 pipeline 之間修改了

...             # 'OUR-SEQUENCE-KEY',我們最好的選擇是重試

...             continue


注意,因為在整個 WATCH 過程中,Pipeline 必須綁定到一個連接,必須調用 reset() 方法確保連接返回連接池。如果 Pipeline 用作 Context Manager(如上面的例子所示), reset() 會自動調用。當然,也可以用手動的方式明確調用 reset():
復制代碼 代碼如下:

>>> pipe = r.pipeline()

>>> while 1:

...     try:

...         pipe.watch('OUR-SEQUENCE-KEY')

...         current_value = pipe.get('OUR-SEQUENCE-KEY')

...         next_value = unicode(int(current_value) + 1)

...         pipe.multi()

...         pipe.set('OUR-SEQUENCE-KEY', next_value)

...         pipe.execute()

...         break

...     except WatchError:

...         continue

...     finally:

...         pipe.reset()

重點(譯者注):

?WATCH 執行后,pipeline 被設置成立即執行模式

?用 MULTI 命令把 pipeline 設置成緩沖模式

?要么使用 with,要么顯式調用 reset()

有一個簡便的名為“transaction”的方法來處理這種處理和在 WatchError 重試的模式。它的參數是一個可執行對象和要 WATCH 任意個數的鍵,其中可執行對象接受一個 pipeline 對象做為參數。上面的客戶端 INCR 命令可以重寫如下(更可讀):

復制代碼 代碼如下:

>>> def client_side_incr(pipe):

...     current_value = pipe.get('OUR-SEQUENCE-KEY')

...     next_value = unicode(int(current_value) + 1)

...     pipe.multi()

...     pipe.set('OUR-SEQUENCE-KEY', next_value)

>>>

>>> r.transaction(client_side_incr, 'OUR-SEQUENCE-KEY')

4.7 版本計劃

redis-py 跟隨 Redis 發布版本。如 redis-py 2.0.0 應該支持 Redis 2.0.0 的所有命令。

4.8 作者

redis-py 由 Andy McCurdy (sedrik@gmail.com) 開發并維護。項目地址在:http://github.com/andymccurdy/redis-py

特別鳴謝:

?Ludovico Magnocavallo, Python Redis 客戶端的原作者, 其中一些 socket 代碼現在還在使用。

?Alexander Solovyov 提供通用響應回調系統的思想。

?Paul Hubbard for initial packaging support.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频专区| 国产精品99久久久久久久久久久久| 2025国产精品视频| 日韩精品在线免费观看视频| 亚洲欧洲在线免费| 欧美极品在线视频| 亚洲二区在线播放视频| 欧美成人激情视频免费观看| 亚洲欧美资源在线| 日韩欧美中文免费| 国产精品久久久久秋霞鲁丝| 欧美性生活大片免费观看网址| 亚洲精品日产aⅴ| 91po在线观看91精品国产性色| 97视频色精品| 国产综合在线看| 在线色欧美三级视频| 欧美成人免费播放| 精品呦交小u女在线| 91麻豆桃色免费看| 久久精品中文字幕一区| 中文字幕日本欧美| 美日韩在线视频| 国产亚洲精品一区二区| 欧美激情手机在线视频| 精品国内亚洲在观看18黄| 欧美午夜激情小视频| 九九视频这里只有精品| 国产一区二区三区视频免费| 亚洲乱码国产乱码精品精| 91系列在线观看| 91久久精品日日躁夜夜躁国产| 精品福利樱桃av导航| 久久这里只有精品99| 国产丝袜高跟一区| 国产精品毛片a∨一区二区三区|国| 国产精品99久久久久久久久久久久| 亚洲成人a**站| 国产日韩欧美中文| 日本精品久久中文字幕佐佐木| 亚洲第一视频网站| 欧美三级欧美成人高清www| 国产99在线|中文| 亚洲va久久久噜噜噜久久天堂| 2019精品视频| 51视频国产精品一区二区| 日韩免费精品视频| 在线精品高清中文字幕| 欧美精品久久久久a| 久久久久久久久爱| 日韩av电影手机在线| 欧美体内谢she精2性欧美| 欧美三级免费观看| 亚洲欧美中文字幕| 福利精品视频在线| 精品日韩中文字幕| 亚洲国产97在线精品一区| 久久久精品一区二区三区| 日韩欧美精品在线观看| 欧美在线视频一区| 97精品免费视频| 久久777国产线看观看精品| 欧美日韩中文字幕在线视频| 高清一区二区三区四区五区| 午夜精品在线观看| 国产99在线|中文| 91国产一区在线| 98精品国产自产在线观看| 中文字幕日韩精品在线| 日韩麻豆第一页| 成人情趣片在线观看免费| 国模叶桐国产精品一区| 日韩精品极品视频免费观看| 国产在线不卡精品| 疯狂欧美牲乱大交777| 欧美大成色www永久网站婷| 亚洲影视中文字幕| 欧美丰满少妇xxxx| 国产精品成久久久久三级| 国产日产久久高清欧美一区| 亚洲日本中文字幕| 日韩精品免费观看| 日本人成精品视频在线| 亚洲美女久久久| 久久精品小视频| 国产香蕉精品视频一区二区三区| 中文字幕欧美精品日韩中文字幕| 国产精品久久一| 在线观看中文字幕亚洲| 美女性感视频久久久| 久久九九热免费视频| 欧美午夜久久久| 亚洲一区二区三区成人在线视频精品| 亚洲精品久久久久| 欧美一区深夜视频| 国产精品黄视频| 亚洲国产三级网| 日韩av成人在线| 成人网在线免费观看| 日韩中文有码在线视频| 51视频国产精品一区二区| 午夜免费日韩视频| 91久久精品视频| 国产日韩在线亚洲字幕中文| 久久综合久中文字幕青草| 91在线色戒在线| 国产精品免费观看在线| 日韩欧美在线视频免费观看| 九九久久久久久久久激情| 中文字幕久热精品视频在线| 日韩在线中文字幕| 欧美色视频日本高清在线观看| 98精品国产高清在线xxxx天堂| 久久99精品久久久久久青青91| 亚洲999一在线观看www| 久久中文字幕一区| 日韩免费不卡av| 亚洲欧美自拍一区| yw.139尤物在线精品视频| 亚洲欧美精品中文字幕在线| 久久99热这里只有精品国产| 精品无人区乱码1区2区3区在线| 国产精品视频最多的网站| 欧美国产一区二区三区| 91网站免费观看| 欧美激情亚洲综合一区| 国产一区二区在线免费视频| 亚洲欧美国产日韩中文字幕| 欧美在线视频播放| 国产精品美女呻吟| 国产精品久久77777| 国产精品美乳一区二区免费| 欧美亚洲国产视频小说| www.99久久热国产日韩欧美.com| 欧美成人一区二区三区电影| 国产精品一香蕉国产线看观看| 国产精品久久久久久久一区探花| 国产午夜精品理论片a级探花| 综合136福利视频在线| 国产精品久久久久秋霞鲁丝| 精品国产一区二区三区久久久| 国产精品扒开腿做爽爽爽视频| 欧美日产国产成人免费图片| 亚洲精品久久久久久下一站| 国模私拍视频一区| 日韩欧美在线国产| 国产主播喷水一区二区| 久久综合88中文色鬼| 亚洲国产精品网站| 亚洲欧美制服另类日韩| 亚洲女成人图区| 中文字幕自拍vr一区二区三区| 国产成人自拍视频在线观看| 亚洲第一男人av| 国产精品av免费在线观看| 欧美一区二区三区免费观看| 色多多国产成人永久免费网站| 91久久国产综合久久91精品网站| 最新国产精品亚洲| 日韩中文字幕免费看| 欧美黄色片在线观看| 欧美大胆在线视频| 亚洲片在线资源| 精品久久久久久久久久久久久|