redis隊列使用基於python的redis操作

redis-python簡單交互

關於redis服務的搭建和安裝以及如何在阿里雲上部署可以看我之前的文章,上面有詳細的說明。
redis是否安裝成功,可以測試,輸入命令redis-cli,如果正常再輸入ping,看是否回覆pong。如果一切正常就是安裝成功了。不成功的話再看我之前的文章的詳細說明。

python直接連接redis,並進行簡單設置操作

下面的代碼進行了redis服務的連接,並設置參數測試。
easy_redis.py

#-*-coding:utf-8-*-
import redis

# redis連接
re_data = redis.Redis(host='localhost', port=6379 )

# key value存儲到redis數據庫
re_data.set('chinese', 'python')

# 根據key獲取存的數據的內容
data_info = re_data.get('chinese')

# 輸出從redis庫中取出來的數據的內容
print(data_info) #結果會輸出 b'python'

python通過連接池連接redis,並進行簡單設置操作

在每次使用redis都進行連接的話會拉低redis的效率,都知道redis是基於內存的數據庫,效率賊高,所以每次進行連接比真正使用消耗的資源和時間還多。所以爲了節省資源,減少多次連接損耗,連接池的作用相當於緩存了多個客戶端與redis服務端的連接,當有新的客戶端來進行連接時,此時,只需要去連接池獲取一個連接即可,實際上連接池就是把一個連接共享給多個客戶端,可以說是廣播,要用的話就去接收。
pool_redis.py

#-*-coding:utf-8-*-
import redis

# 連接池連接使用,節省了每次連接用的時間
conn_pool = redis.ConnectionPool(host='localhost',port=6379)

# 第一個客戶端訪問
re_pool = redis.Redis(connection_pool=conn_pool)
# 第二個客戶端訪問
re_pool2 = redis.Redis(connection_pool=conn_pool)


# key value存儲到redis數據庫
try:
    re_pool.set('chinese1', 'hello_world')
    re_pool2.set('chinese2', 'hello_python')
except Exception as e:
    print(e)

# 根據key獲取存的數據的內容
data_info = re_pool.get('chinese1')
data_info2 = re_pool.get('chinese2')

# 輸出從redis庫中取出來的數據的內容
print(data_info)
print(data_info2)
# 獲取兩個連接的信息
id1 = re_pool.client_list()
id2 = re_pool2.client_list()
# 輸出兩個連接的id,判斷是否一致
print('re_pool_id{}======re_pool2_id{}'.format(id1[0]['id'], id2[0]['id']))
# 整個程序輸出結果
b'hello_world'
b'hello_python'
re_pool_id30======re_pool2_id30

可以看出兩個redis的連接id相同,是同一個連接。

redis隊列操作redis-MQ

redis的隊列效率高,而且簡單易用。下面我說一個最近項目中的需求,來介紹reids隊列,更容易理解並且當你也有這種項目中類似的需求的時候可以很輕鬆的拿來用。
首先我的項目需要根據傳遞的不同的參數,爬取境外網站的一些內容,例如facebook中。但是項目目前的服務器不能翻牆,所以要在另一臺服務器上運行爬蟲,在目前項目服務器上傳參數給翻牆過的服務器用來運行爬蟲。

lpush, lrange

首先我需要把參數塞到redis服務,現在第一步從左往右插入隊列。用lpush,然後用lrange直接驗證是否插入成功,代碼如下:
push_params.py

#-*-coding:utf-8-*-

import redis
import json

# redis連接
re_queue = redis.Redis(host='localhost', port=6379 )

# 順序插入五條數據到redis隊列,sort參數是用來驗證彈出的順序
num = 0
for i in range(0, 5):
    num = num + 1
    # params info
    params_dict = {"channel":"facebook", "operate":"publish", "sort":num}
    # 從左往右入隊到redis
    re_queue.lpush("params_info", json.dumps(params_dict))

# 查看目標隊列數據
result = re_queue.lrange("params_info", 0, 10)
print(result)
# 結果輸出
# [b'{"channel": "facebook", "operate": "publish", "sort": 5}', b'{"channel": "facebook", "operate": "publish", "sort": 4}', b'{"channel": "facebook", "operate": "publish", "sort": 3}', b'{"channel": "facebook", "operate": "publish", "sort": 2}', b'{"channel": "facebook", "operate": "publish", "sort": 1}']

rpop

從左往右,第一個進的肯定是在最右邊,要處理第一個,就要從右往左彈出,代碼如下:
pop_params.py

#-*-coding:utf-8-*-

import redis
import json


# redis連接
re_queue = redis.Redis(host='localhost', port=6379)

for i in range(0, 5):
    result = re_queue.rpop("params_info")
    print(result)
    
# 結果輸出
#b'{"channel": "facebook", "operate": "publish", "sort": 1}'
#b'{"channel": "facebook", "operate": "publish", "sort": 2}'
#b'{"channel": "facebook", "operate": "publish", "sort": 3}'
#b'{"channel": "facebook", "operate": "publish", "sort": 4}'
#b'{"channel": "facebook", "operate": "publish", "sort": 5}'

rpush,lpop

rpush從右往左入隊,第一個在最左邊,把上邊lpush改成rpush,輸出結果如下:

[b'{"channel": "facebook", "operate": "publish", "sort": 1}', b'{"channel": "facebook", "operate": "publish", "sort": 2}', b'{"channel": "facebook", "operate": "publish", "sort": 3}', b'{"channel": "facebook", "operate": "publish", "sort": 4}', b'{"channel": "facebook", "operate": "publish", "sort": 5}']

lpop從左邊彈出結果如下:
把上邊rpop改成lpop,輸出結果如下:

b'{"channel": "facebook", "operate": "publish", "sort": 1}'
b'{"channel": "facebook", "operate": "publish", "sort": 2}'
b'{"channel": "facebook", "operate": "publish", "sort": 3}'
b'{"channel": "facebook", "operate": "publish", "sort": 4}'
b'{"channel": "facebook", "operate": "publish", "sort": 5}'

小結

這些出對入隊的方式理解了之後,你就對redis的隊列有了一定的認識,最終到底怎麼用,還是看你的項目需要了。真正的項目應用中,是在原來項目中把另一臺服務器需要的參數傳到目標redis服務端,地址也不是localhost,需要你把localhost改成目標host,端口也需要根據你們設置的端口進行更改,默認的是6379。push到redis隊列之後,接下來就要在你需要的服務器上取出redis隊列中的參數,現在你取出參數之後就要根據參數的區別進行不同的調用了。

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