python連接Redis操作

 在使用django的websocket的時候,發現web請求和其他當前的django進程的內存是不共享的,猜測django的機制可能是每來一個web請求,就開啓一個進程去與web進行交互,一次來達到利用cpu多核的目的。但是這樣一來,內存共享的問題就變成了焦點。這周試了一下redis,果然很好用。

  redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

  上面的話好像很專業的樣子,這裏我們簡單的理解爲,其實redis就是一個消息中間件,可以作爲多個進程的消息中轉站,是比之前我們用的manage模塊更方便自由的共享內存。

  redis的安裝和啓動自己到網上去找,由於操作系統等環境差異,這裏不多贅述。我們要使用python操作redis,還需要一個redis模塊。可以直接使用pip安裝。

  假設我們已經啓動了redis,也安裝好了相關的python模塊,redis的啓動默認端口是6379,現在就來看看redis應該如何使用。

1.基本操作

  之前我們已經知道,redis是以key-value的形式存儲的,所以我們在操作的時候。首先我們將redis所在主機的ip和發佈端口作爲參數實例化了一個對象r,然後執行set('name','Eva_J'),這樣我們就在內存中存儲了一個key爲name,值爲‘Eva_J’的項。我們可以理解爲{'name':'Eva_J'},當我們要讀取的之後,只需要get('name'),就會得到'Eva_J'的值。

2.連接池

redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然後作爲參數Redis,這樣就可以實現多個Redis實例共享一個連接池。

3、管道

redis-py默認在執行每次請求都會創建(連接池申請連接)和斷開(歸還連接池)一次連接操作,如果想要在一次請求中指定多個命令,則可以使用pipline實現一次請求指定多個命令,並且默認情況下一次pipline 是原子性操作。

4、發佈訂閱

發佈者:服務器

訂閱者:Dashboad和數據處理

Demo如下:

定義一個redishelper類,建立與redis連接,定義頻道爲fm92.4,定義發佈public及訂閱subscribe方法。

訂閱者:導入剛剛我們寫好的類,實例化對象,調用訂閱方法,就可以使用while True接收信息了。

發佈者:導入剛剛我們寫好的類,實例化對象,調用發佈方法,下例發佈了一條消息‘hello’

更多與共享內存相關的內容參見:http://www.cnblogs.com/wupeiqi/articles/5132791.html

更多與redis相關的內容參見:https://github.com/andymccurdy/redis-py/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章