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

來源:互聯網
上載者:User

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.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.