1. 程式人生 > >Python使用redis的訊息佇列

Python使用redis的訊息佇列

Python使用redis的訊息佇列Python使用redis的訊息佇列

Redis 服務
  1、安裝

  yum install redis

  2、 python安裝支援模組

  /opt/python2.7.13/bin/pip install redis

  3、 和redis的簡單直接互動

  In [1]: import redis

  In [2]: rc = redis.Redis(host='192.168.8.237',port=6379,decode_responses=True)

  In [5]: rc.set('imoocc','jeson')

  Out[5]: True

  In [7]: rc.get('imoocc')

  Out[7]: u'jeson'
Redis簡單操作

對於和Redis的互動, Redis的類中提供了連線池的方式,我們可以通過連線池管理並操作Redis。

  1、連線池建立,利用連線池連線

  In [8]: connpool = redis.ConnectionPool(host='192.168.8.237',port=6379,decode_responses=True)

  In [9]: rc = redis.Redis(connection_pool=connpool)

  In [10]: rc.set('imooccp','1234566')

  Out[10]: True

  In [11]: rc.get('imooccp')

  Out[11]: u'1234566'

  2、redis中DB ,指定資料存取的DB

  redis.conf中設定了db的數量,那麼redis的資料庫名也為0 到15,如下:

  databases 16

  指定使用那個資料庫名,我們通過如下的方式,就可以了:

  In [29]: connpool = redis.ConnectionPool(host='192.168.8.237',port=6379,decode_responses=True,db=3)

  In [30]: rc.set('test2','lllll')

  Out[30]: True

  這樣就將資料庫寫入到db3了,如何驗證呢?我們從服務端來認證最直接,如下:

  用redis-cli(redis自帶的工具)登入服務端,檢視寫入的key。

  127.0.0.1:6379> SELECT 3

  OK

  127.0.0.1:6379[3]> KEYS * //檢視db 3這個庫下所有的key

  1) "imooccc"

那麼 接下來介紹redis詳細專案使用的內容,大家不要覺得介紹的內容擴散太大。

最近在作一個任務系統,任務寫入是不定時的,我們需要用一個程式去定期消費這些任務,必須是有先後順序的,而且是前一個任務確認執行完後,才會去執行下一個。

怎麼辦呢?用佇列啊,對吧!用什麼佇列,怎麼用?

介紹下為什麼要用redis來作訊息處理:

簡單說,redis支援兩種消費模式,一種釋出-訂閱模式,及一個訊息會被多個消費者處理(簡單說類似是一個廣播訊息,所有人都會接收)。很明顯我得系統中不需要這麼用,系統裡邊就需要佇列模式,及先到的任務優先處理。那麼對佇列用什麼型別得資料庫結構來作呢?

先得聊聊list

list 這個資料型別,在python裡是一個列表,在redis裡就是一個有序佇列(或者說資料鏈表)了。

型別圖示如下:
Python使用redis的訊息佇列Python使用redis的訊息佇列

大家看了這個結構就可以清楚了,我們可以利用list的資料介面模式,設計從左端和右端都可以對list進元素的同向處理(滿足佇列的特性先到先出)。

  1、從左端插入元素

  In [10]: rc.lpush('tasklist',1,2,3)

  Out[10]: 3L

  列印輸出內容,如下:

  In [17]: print(rc.lrange('tasklist',0,2))

  [u'3', u'2', u'1']

  類似的從左測插入的方法還有lpushx(name,value),區別只有當name存在才將value插入到最左邊。

  2、從右邊插入元素

  In [21]: rc.rpush('tasklist','5')

  Out[21]: 5L

  In [22]: print(rc.lrange('tasklist',0,4))

  [u'4', u'3', u'2', u'1', u'5']

  3、從左邊取出元素怎麼取呢?

  In [23]: rc.lpop("tasklist")

  Out[23]: u'4'

  In [24]: rc.lpop("tasklist")

  Out[24]: u'3'

  In [25]: print(rc.lrange('tasklist',0,4))

  [u'2', u'1', u'5']

  我們會看到從左側已經取出了兩個元素了。剩下來[u'2', u'1', u'5']

  4、從右側呢?

  當然就是rc.rpop()了

  python對於redis的基礎使用和Redis作為佇列的簡單使用就介紹這些,

  python的工程裡邊如何更好封裝redis庫的連線和方法,

  及python很多的知識內容,大家可以關注我,我將提