python——操做Redis

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

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

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

  redis的安裝和啓動本身到網上去找,因爲操做系統等環境差別,這裏很少贅述。咱們要使用python操做redis,還須要一個redis模塊。能夠直接使用pip安裝。github

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

1.基本操做redis

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

2.鏈接池緩存

redis-py使用connection pool來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。默認,每一個Redis實例都會維護一個本身的鏈接池。能夠直接創建一個鏈接池,而後做爲參數Redis,這樣就能夠實現多個Redis實例共享一個鏈接池。服務器

三、管道websocket

redis-py默認在執行每次請求都會建立(鏈接池申請鏈接)和斷開(歸還鏈接池)一次鏈接操做,若是想要在一次請求中指定多個命令,則可使用pipline實現一次請求指定多個命令,而且默認狀況下一次pipline 是原子性操做。

四、發佈訂閱

發佈者:服務器

訂閱者: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/

相關文章
相關標籤/搜索