簡體   English   中英

Mediatr - 使緩存失效/更新的正確位置在哪里

[英]Mediatr - Where is the right place to invalidate/update cache

這個問題源於我問過的關於太多接口、QCRS 和 Mediatr 庫(請求/響應)的另一個問題

Mediatr:減少 DI 對象的數量

我創建了一堆命令和查詢,我有一堆行為,其中一個是緩存行為,對於每個查詢,在實際針對數據庫執行查詢之前,會檢查緩存的值。 到目前為止,這很好用,但是當我有一個 UpdateSomethingCommand 時,delima 就出現了,一旦我更新了數據庫中的底層對象,我想用成功保存到數據庫的內容刷新緩存。

我的問題是具體何時實際更新緩存:

  1. 在 UpdateSomethingCommandHandler 中(這可能會破壞 SOLID 主體)
  2. 在 UpdateSomethingCommandHanlder 中調用另一個專門用於更新緩存的命令(不確定這是一個好的設計原則)
  3. 引入另一種專為更新緩存而設計的行為(尚不確定如何進行)
  4. 有更好的解決方案嗎?

我們對一個使用 MediatR 的項目有類似的需求,最終將緩存合並到中介管道中,包括您描述的緩存失效。

基本前提是我們在管道中插入了兩種不同的行為,一種用於緩存來自請求的響應,另一種用於使來自不同請求的緩存請求響應無效。

這兩種行為之間存在一些相互作用,因為它們需要交換緩存密鑰以使正確的請求無效。

我最近將其中的一些工作放到了一個獨立的庫中,理論上可以按原樣將其放入任何使用 MediatR 的項目中。 在您的情況下,您可能只想查看我們在此處使用的技術並根據需要重新創建它們。

我不會在這里和現在重復所有內容,而是將您指向項目頁面,其中主頁上的“入門”鏈接下有一些文檔: https : //github.com/Imprise/Imprise.MediatR.Extensions.Caching

在我看來,緩存失效使整個過程非常簡單明了,但在某些情況下,我們需要更好地控制失效發生的時間。 在這些情況下,我們已經采取了另一種方法是注入一個ICache<TRequest, TResponse> cacheINotificationHandler秒,然后調用_cache.Remove(key); 根據需要手動。 然后,你知道應該只是無效提高由該處理的通知的任何請求INotificationHandler_mediator.Publish(SomethingUpdated);

我的建議是使用緩存行為來處理實現某種 ICacheableRequest 標記接口的請求,並將緩存失效作為相應更新/刪除命令處理程序中的一個步驟(如您在第 1 點中提到的)。

如果您選擇創建無效程序行為,則存在一些問題。

首先,不清楚該命令是否使緩存無效。 每當我需要檢查更新/刪除實體時發生了什么時,我只需遵循命令處理程序,通過創建單獨的緩存無效器沒有副作用(更難遵循)。

其次,即使將失效代碼放在單獨的文件中更符合 SRP,您也必須選擇放置緩存失效器類的位置。 它是在緩存查詢旁邊還是在使緩存無效的命令處理程序旁邊?

第三,在許多情況下,您沒有足夠的關於用於在關聯命令中緩存請求的密鑰的信息,您只會在 CommandHandler 中獲得該信息和任何其他額外的無效條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM