Python操作Reids之任務佇列

2021-07-05 05:49:57 字數 2179 閱讀 3968

使用redis的lpush 和 brpop,我們可以實現乙個簡單模式的分布式程式。分布式,其實我也是一知半解,所以,就按照我所理解的分布式進行說明吧。

乙個系統,採用了分布式的部署,假設有三個節點,通俗點說,三颱機器上放了三個一模一樣的程式,那麼同時執行這三個程式時,如果他們要對同乙個資源進行獨佔的訪問,就會引發他們之間的競爭,由於是獨佔的,乙個佔了,其他兩個就得站在那裡幹等著,如此以來,還是乙個程式在跑。我們用分布式,是希望同時執行多個一模一樣的程式,既好管理,也容易增減。這其實就涉及到了乙個關鍵的問題,就是任務的分配。程式一模一樣,但我們可以給他們不同的任務啊,每個程式對任務處理的方式都是一樣的,因此,我們只需要再增加乙個任務發布的程式就好了,這個程式負責向其他三個程式發布任務,三個程式再收到各自的任務後,執行任務即可。

為了方便的增減節點,就需要發布任務的程式不必考慮有多少個節點在等待任務,他只管發布。每乙個節點之間也不必管其他節點是怎麼想的,只管去任務池裡去取任務,拿得到任務就幹活,拿不到就歇著。

就按照這個思路,我們利用redis的佇列來實現這個超簡單的分布式程式。

首先,我們需要乙個發布任務的程式:

# coding=utf-8

'''created on 2015-9-11

@author: administrator

'''import redis

pool=redis.connectionpool(host='192.168.1.142',port=6379,db=0)

r = redis.strictredis(connection_pool=pool)

while true:

input = raw_input("publish:")

if input == 'over':

print '停止發布'

break;

r.lpush('tq', input)

這段程式裡,raw_input接收使用者輸入,然後放入到名為tq的佇列中等待被取出來

接下來是取任務的程式

# coding=utf-8

'''created on 2015-9-11

@author: administrator

'''import time

import redis

pool=redis.connectionpool(host='192.168.1.142',port=6379,db=0)

r = redis.strictredis(connection_pool=pool)

while true:

task = r.brpop('tq', 0)

print 'pro1 get task' + task[1];

time.sleep(10);

# coding=utf-8

'''created on 2015-9-11

@author: administrator

'''import time

import redis

pool=redis.connectionpool(host='192.168.1.142',port=6379,db=0)

r = redis.strictredis(connection_pool=pool)

while true:

task = r.brpop('tq', 0)

print r.llen('tq')

print 'pro2 get task' + task[1];

time.sleep(10);

我這裡寫了兩個基本一樣的程式,是為了檢視實驗的效果,啟動這三個指令碼,乙個用來發布任務,另外兩個用來取任務

實驗效果截圖如下

除了lpush這個函式,還提供了乙個lpushx,該函式和lpush的區別在於,如果key不存在,lpush會先自動建立,而lpushx則不會,也就是說,如果這個key不存在,你呼叫lpushx這個函式是不起作用的。

任務嘛是乙個佇列,你能從左邊push也能從右邊push,能從左邊pop也能從右邊pop,所以,對應的函式有這些,lpush.rpush,lpushx,rpushx,brpop,blpop。

reids 命令相關操作

redis cli 連線 redis 檢查是否連線成功 切換db庫 設定 redis key 以資料夾的形式存在 redis 各種操作型別操作 set k v 新增一條string型別資料 get k v 獲取一條string型別資料 mset k1 v1 k2 v2 新增多條string型別資料 ...

Reids原理之IO模型

眾所周知redis是單程序單執行緒的應用,在如今多核橫行的時代,我們不免有疑問,單執行緒的redis怎麼就成了高效能的代表 當有多個執行緒同時呼叫redis的時候,那麼單執行緒的redis是怎麼處理的呢,這裡就不得不說redis內部的io模型 首先要提到幾個概念,阻塞io,非阻塞io,同步io,非同...

reids持久化之AOF

1 前言 rdb 的缺陷是最後一次持久化後的資料可能丟失。而aof就是用來解決這個問題的.2 簡介 3 aof的重寫 aof採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當aof檔案的大小超過所設定的閾值時,redis就會啟動aof檔案的內容壓縮,只保留可以恢復資料的最小指令集...