Sitecoreのキャッシュを削除するコードを発見する方法


説明

Sitecoreプラットフォームは、パフォーマンスを最大化するために、複数レベルのキャッシュを搭載しています。アイテムの取得作業は、デフォルトでは、以下の複数のキャッシュ層によって補助されています:

プラットフォームのキャッシュ層のロジックは、Sitecore.Caching名前空間の下にあり、主なキャッシュ関連のロジックは、Sitecore.Abstractions.BaseCacheManagerコンストラクタまたはSitecore.Caching.CacheManager静的クラスにあります。
なお、CacheManagerが提供するClearAllCaches() APIは、以前に登録されたキャッシュをすべて削除するため、一時的にパフォーマンスの低下を引き起こす恐れがあります。使用すると、対応するログ エントリがSitecoreログ ファイルに出力されます:

WARN All caches have been cleared. This can decrease performance considerably.

Sitecore.Caching.ICacheInfoインターフェースは、より詳細なレベルでキャッシュをクリアできるClear() APIメソッドを定義しています。

Sitecoreプラットフォームは、キャッシュ削除の原因を突き止める診断機能を装備しています。

解決策

診断メッセージを書き込むようキャッシュ削除機構を設定するには、以下の手順を実施してください。

  1. 次の設定をSitecore設定に追加します:
    <setting name="Caching.DebugEnabled" value="true" />
  2. Sitecoreロガーが診断メッセージを書き込むよう設定します:
    <root>
      <priority value="DEBUG" />
    </root>

キャッシュのクリーン アップのコール スタックを含むデバッグ ログ エントリを見つけることができます:

6080 2018:07:04 16:08:22 DEBUG The 'web[blobIDs]' cache has been cleared.
Entries removed: 0
StackTrace:
   at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
   at System.Environment.get_StackTrace()
   at Sitecore.Caching.Generics.Cache`1.DoLogDebugMessage(String messagePrefix, String messageBody, Boolean ensureDebugEnabled) in
   at Sitecore.Caching.Generics.Cache`1.Clear()
   at Sitecore.sitecore.admin.CacheAdmin.ClearAllButtonClick(Object sender, EventArgs arguments)
   at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)

調査完了後、設定変更を元に戻します。