python使用redis做缓存_Python中的Redis客户端缓存(二)
Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
處理失效
無效消息如何發送到被追蹤的客戶端取決于客戶端正在使用的Redis序列化協議(RESP)。早期版本的Redis使用RESP2,但是它的后續版本RESP3已經存在于Redis 6中,并且Redis 7將完全不支持舊協議。
RESP3包含許多新功能,包括服務器在客戶端現有連接上“推送”除了實際回復內容的附加信息。此通道用于在使用服務器輔助的客戶端緩存功能時傳遞無效通知。
然而,由于RESP3比較新,目前只有少數客戶端支持它,因此RSACSC也可以與RESP2一起工作。由于RESP2缺乏“推送”能力,RSACSC使用Redis中對PubSub的現有支持向相關方廣播失效消息。
管理器的作用是處理失效和插槽映射的鍵。下面是它的樣子:
管理器初始化會生成一個連接池,從該連接池為PubSub創建自己的客戶端以及通過應用程序請求的任何后續緩存連接。它還維護一個名為slots的字典,該字典將一個slot number映射到它所保存的一組鍵名。最后,它維護LRU緩存實現的Cache類。
start()方法通過在單獨的線程中監聽invalidate PubSub通道來啟動管理器,這并不奇怪。在該通道上截獲的消息由_handler()方法處理。它依次調用invalidate()方法以使請求的插槽無效:
失效是要一個接一個地從相應的插槽集合中彈出鍵,然后從緩存中刪除它們。最后,管理器暴露了一個工廠方法get_connection(),使用它來獲取新的緩存連接:
一些評估
這篇文章并不是關于基準測試或Python本身的性能,但是理解該機制的影響是很重要的。為此,我在2019 MacBook Pro上使用了benchmark.py腳本,其中一個Redis實例使用默認值在本地運行(除了我關閉了快照功能)。
在執行測試之前,基準腳本用1000個鍵填充數據庫,并將緩存管理器的容量設置為100。然后它運行幾個計時測試來測量性能。對于兩種類型的連接,每個測試都重復五次:常規連接和緩存連接。
第一個測試的結果實際上證明了緩存的一個缺點:緩存未命中。在這個測試中,我們對整個數據庫中的每個鍵只讀取一次,因此每次訪問本地緩存都會導致未命中:
請注意,只計算最后一次運行的平均值,因此系列測試中的每一次都被視為熱身。上面的平均值顯示,每1000次讀取,緩存未命中導致讀取增加近13ms,大約18%的延遲增加。
但是,在適合緩存的數據集上重復測試(也就是說,只有100個鍵顯示了更令人鼓舞的結果)。雖然第一次緩存運行顯示延遲增加,但隨后的運行中延遲減少兩個數量級:
下一個測試名為eleven_reads,因為它會將數據庫中的每個鍵讀取一次,同時讀取其他10個始終相同的鍵。這個高度集成的用例提供了緩存好處的一個更顯著的證明(盡管這本身不是目的)。
最后一個測試加入了一個額外的寫入操作,這將觸發部分緩存的失效。緩存的延遲略有增加,這既是因為額外的write命令,也是因為需要重新提取緩存的內容:
部分思考
花時間緩存是有用處的。您可能已經熟悉了Redis的Keyspace notifications,它們是關于keyspace的事件,例如對PubSub通道上發送的鍵的修改。實際上,Keyspace notifications的使用方式與Redis服務器輔助客戶端緩存的使用方式幾乎相同,能獲得類似的結果。
由于PubSub不是一種可靠的消息傳輸方式,使用Keyspace notifications或基于RESP2的RSACSC都可能導致失效通知丟失和內容過時。然而,隨著RESP3的出現,只要連接處于活動狀態,RSACSC通知就會被發送。任何斷開連接都可以通過本地緩存重置輕松處理。
將RESP3從PubSub廣播移到特定于連接的通知還意味著客戶端將只獲得感興趣的插槽的失效通知。這意味著用于通信的資源消耗更少。
不管使用的是不是RESP版本,客戶端作者都可以使用RSACSC進行緩存,而不僅僅是獲取整個字符串。該機制不用了解用于存儲密鑰值的實際數據結構,因此所有核心Redis類型和模塊聲明的任何自定義類型都可以與之一起使用。
此外,客戶機不僅可以緩存鍵值元組,還可以緩存請求及其響應(同時追蹤所涉及的鍵)。這樣做可以緩存GETRANGE返回的子字符串、通過LRANGE獲得列表元素或任何其他類型的查詢。
關于Redis的CRC64函數的一點筆記
我知道我不想在這個練習中實現CRC函數。我以為Python已經為我準備好了。
要查找哪個CRC Redis正在使用,只需查看它的源代碼--在src/crc64.c文件開頭:
我對“Python CRC64-jones”進行了快速搜索,在瀏覽完文檔之后,我選擇pip安裝crcmod,這樣我就可以使用它預定義的crc-64-jones摘要。
過了一段時間,我發現了我的東西不起作用的原因。通過對文檔的仔細檢查發現,crcmod使用了一個不同的多項式。他們在一起,你能看出區別嗎?
此外,crcmod堅決拒絕使用Redis的多項式,并聲稱:
當然,后來我放棄并移植了Redis CRC64實現。不是困難任務:一個拷貝粘貼,幾個搜索替換,一行實際代碼重寫。如果要使用RSACSC,請確保使用的CRC64實現簽出到0xe9c6d914c4b8d9ca。
英文原文:https://engineering.redislabs.com/posts/redis-assisted-client-side-caching-in-python/
譯者:QL
總結
以上是生活随笔為你收集整理的python使用redis做缓存_Python中的Redis客户端缓存(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python定时下载链接_python定
- 下一篇: python迭代器使用_Python迭代