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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM