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’