[英]Mediatr - Where is the right place to invalidate/update cache
這個問題源於我問過的關於太多接口、QCRS 和 Mediatr 庫(請求/響應)的另一個問題
我創建了一堆命令和查詢,我有一堆行為,其中一個是緩存行為,對於每個查詢,在實際針對數據庫執行查詢之前,會檢查緩存的值。 到目前為止,這很好用,但是當我有一個 UpdateSomethingCommand 時,delima 就出現了,一旦我更新了數據庫中的底層對象,我想用成功保存到數據庫的內容刷新緩存。
我的問題是具體何時實際更新緩存:
我們對一個使用 MediatR 的項目有類似的需求,最終將緩存合並到中介管道中,包括您描述的緩存失效。
基本前提是我們在管道中插入了兩種不同的行為,一種用於緩存來自請求的響應,另一種用於使來自不同請求的緩存請求響應無效。
這兩種行為之間存在一些相互作用,因為它們需要交換緩存密鑰以使正確的請求無效。
我最近將其中的一些工作放到了一個獨立的庫中,理論上可以按原樣將其放入任何使用 MediatR 的項目中。 在您的情況下,您可能只想查看我們在此處使用的技術並根據需要重新創建它們。
我不會在這里和現在重復所有內容,而是將您指向項目頁面,其中主頁上的“入門”鏈接下有一些文檔: https : //github.com/Imprise/Imprise.MediatR.Extensions.Caching
在我看來,緩存失效使整個過程非常簡單明了,但在某些情況下,我們需要更好地控制失效發生的時間。 在這些情況下,我們已經采取了另一種方法是注入一個ICache<TRequest, TResponse> cache
到INotificationHandler
秒,然后調用_cache.Remove(key);
根據需要手動。 然后,你知道應該只是無效提高由該處理的通知的任何請求INotificationHandler
如_mediator.Publish(SomethingUpdated);
我的建議是使用緩存行為來處理實現某種 ICacheableRequest 標記接口的請求,並將緩存失效作為相應更新/刪除命令處理程序中的一個步驟(如您在第 1 點中提到的)。
如果您選擇創建無效程序行為,則存在一些問題。
首先,不清楚該命令是否使緩存無效。 每當我需要檢查更新/刪除實體時發生了什么時,我只需遵循命令處理程序,通過創建單獨的緩存無效器沒有副作用(更難遵循)。
其次,即使將失效代碼放在單獨的文件中更符合 SRP,您也必須選擇放置緩存失效器類的位置。 它是在緩存查詢旁邊還是在使緩存無效的命令處理程序旁邊?
第三,在許多情況下,您沒有足夠的關於用於在關聯命令中緩存請求的密鑰的信息,您只會在 CommandHandler 中獲得該信息和任何其他額外的無效條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.