摘要:使用事務的其中一個好處就是底層的客戶端會通過使用流水線來提高事務執行時的性能。使用非事務型流水線同樣可以獲得相似的性能提升,并且可以讓用戶同時執行多個不同的命令。
使用事務的其中一個好處就是底層的客戶端會通過使用流水線來提高事務執行時的性能。使用非事務型流水線(non-transactional pipeline)同樣可以獲得相似的性能提升,并且可以讓用戶同時執行多個不同的命令。
MULTI和EXEC也會消耗資源,并且可能會導致其他重要的命令被延遲執行。但也可以在不使用MULTI和EXEC的情況下,獲得流水線帶來的所有好處。
pipe = conn.pipeline()
在執行pipeline()時傳入True作為參數,或者不傳入任何參數,那么客戶端將使用MULTI和EXEC包裹起用戶要執行的所有命令。如果傳入False為參數,那么客戶端同樣會像執行事務那樣收集用戶要執行的所有命令,只是不再使用MULTI和EXEC包裹這些命令。如果用戶需要向Redis發送多個命令,并且對于這些命令來說,一個命令的執行結果并不會影響另一個命令的輸入,而且這些命令也不需要以事務的方式來執行的話,那么我們可以通過向pipeline()方法傳入False來進一步提升Redis的整體性能。
下面是沒有使用非事務型流水線代碼:
def update_token(conn, token, user, item=None): timestamp = time.time() conn.hset("login:", token, user) conn.zadd("recent:", token, timestamp) if item: conn.zadd("viewed:" + token, item, timestamp) conn.zremrangebyrank("viewed:" + token, 0, -26) conn.zincrby("viewed:", item, -1)
使用非實物型流水線后:
def update_token_pipeline(conn, token, uesr, item=None) timestamp = time.time() pipe = conn.pipeline(False) pipe.hset("login:", token, user) pipe.zadd("recent:", token, timestamp) if itme: pipe.zadd("viewed:" + token, item, timestamp) pipe.zremrangebyrank("viewed:" + token, 0, -26) pipe.zincrby("viewed:", item, -1) pipe.execute()
根據測試,高延遲網絡使用流水線時的速度要比不使用流水線時的速度快5倍,低延遲網絡使用流水線也可以帶來接近4倍的速度提升,本地網絡的測試結果實際上已經達到Python在單核環境使用redis協議發送和接收短命令序列的性能極限。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44554.html
摘要:上一篇文章實戰第四章數據安全與性能保障第節非事務型流水線下一篇文章實戰第五章使用構建支持程序第節使用來記錄日志 上一篇文章:Python--Redis實戰:第四章:數據安全與性能保障:第7節:非事務型流水線下一篇文章:Python--Redis實戰:第五章:使用Redis構建支持程序:第1節:使用Redis來記錄日志 習慣了關系數據庫的用戶在剛開始使用Redis的時候,通常會因為Re...
摘要:上一篇文章實戰第四章數據安全與性能保障第節處理系統故障下一篇文章實戰第四章數據安全與性能保障第節非事務型流水線為了確保數據的正確性,我們必須認識到這一點在多個客戶端同時處理相同的數據時,不謹慎的操作很容易會導致數據出錯。 上一篇文章:Python--Redis實戰:第四章:數據安全與性能保障:第5節:處理系統故障下一篇文章:Python--Redis實戰:第四章:數據安全與性能保障:第...
閱讀 2978·2023-04-26 02:29
閱讀 589·2019-08-30 15:54
閱讀 1665·2019-08-29 13:13
閱讀 605·2019-08-28 17:51
閱讀 2728·2019-08-26 13:58
閱讀 1536·2019-08-26 13:27
閱讀 2825·2019-08-26 11:39
閱讀 3450·2019-08-26 10:46