python redis pipeline使用方法_Redis中的管道Pipeline操作
點擊上方藍色字體,選擇“設為星標”
回復”資源“獲取更多資源
點擊右側關注,大數據開發領域最強公眾號!
點擊右側關注,暴走大數據!
Redis默認每次執行請求都會創建和斷開一次連接池的操作,如果想執行多條命令的時候會在這件事情上消耗過多的時間,因此我們可以使用Redis的管道來一次性發送多條命令并返回多個結果,節約發送命令和創建連接的時間提升效率。
介紹
在前面我們介紹過Redis的事務和lua腳本操作,事實上在各語言版本的Redis中都有管道(Pipeline)的功能,本篇以python版作為示例,當我們使用python給redis發送命令時會經歷下面的步驟:
客戶端發送請求,獲取socket,阻塞等待返回;
服務端執行命令并將結果返回給客戶端;
而當執行的命令較多時,這樣的一來一回的網絡傳輸所消耗的時間被稱為RTT(Round Trip Time),顯而易見,如果可以將這些命令作為一個請求一次性發送給服務端,并一次性將結果返回客戶端,會節約很多網絡傳輸的消耗,可以大大提升響應時間。
官網:https://redis.io/topics/pipelining
逐個命令請求:
管道請求:
使用
管道的使用很簡單,python版代碼如下,在管道中可以選擇是否開啟事務,默認是開啟的,這里的事務與Redis的事務一樣為弱事務性不是真正的事務:
import redis#創建連接池獲取連接pool = redis.ConnectionPool(host='wykd', port=6379,password='123456', decode_responses=True)rp1 = redis.Redis(connection_pool=pool)#創建管道,可以選擇開啟或關閉事務,這里的事務與Redis事務一樣是弱事務型pipe = rp1.pipeline(transaction=True)#在管道中添加命令pipe.set('new','123')pipe.set('name', 'wyk2')pipe.set('company', 'csdn2')pipe.hincrby('hage','wyk',1)#這個命令會報錯,因為hage為hash類型不能使用get命令,此時無論開啟關閉事務,管道中的其他命令也依然會正常執行#pipe.get('hage')#也可以用下面的語法將多個命令拼接到一起# pipe.set('name', 'wyk').set('company', 'csdn').hset('hage', 'wyk',28).hincrby('hage','wyk',1)#執行pipeline里的腳本pipe.execute()
當管道中有命令報錯時,無論管道是否開啟事務都不會影響其他腳本的執行:
在管道中可以一次性獲取多個命令的返回值,以列表形式:
pipe.get('name').get('company').hget('hage', 'wyk')res = pipe.execute()print(res)
對比Lua腳本
Redis的Script會當成一個命令,具有原子性,在執行Script的時候不會被其他的命令插入,因此更適合于處理事務;而管道雖然也會將多個命令一次性傳輸到服務端,但在服務端執行的時候仍然是多個命令,如在執行CMD1的時候,外部另一個客戶端提交了CMD9,會先執行完CMD9再執行管道中的CMD2,因此事實上管道是不具有原子性的。
就場景上來說,正因為Lua腳本會被視為一個命令去執行,因為Redis是單線程執行命令的,所以我們不能在lua腳本里寫過于復雜的邏輯,否則會造成阻塞,因此lua腳本適合于相對簡單的事務場景。
而管道因為不具有原子性,因此管道不適合處理事務,但管道可以減少多個命令執行時的網絡消耗,可以提高程序的響應速度,因此管道更適合于管道中的命令互相沒有關系,不需要有事務的原子性,且需要提高程序響應速度的場景。
尾巴
管道可以提升我們程序中的響應時間,同時我們不能完全依賴于它的"事務"機制,只需要把管道當做"批處理"工具即可,在某些場合下,更需要結合管道和lua腳本一起使用。
歡迎點贊+收藏+轉發朋友圈素質三連
文章不錯?點個【在看】吧!👇
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python redis pipeline使用方法_Redis中的管道Pipeline操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一步步用zTree(2)
- 下一篇: JPA时间注解(转)