Sitecore 렌더링된 시간 기반 캐시

10820 단어 sitecorecache

문제


나는 한 장면을 만났다. 한 고객이 그들의 사이트를 다시 정리하고 있는데 가장 큰 변화는 제목을 간단한 클릭에서 완전한 메뉴로 바꾸는 것이다.megamenu에서 모든 부분은 로그인 페이지 기능의 일부분을 도입하여 검색 검색부터 다중 단계까지 깊이 있게 한다.이것은 뷰 모델을 조립하고 출력하기 위해 대량의 데이터 조정이 필요하다는 것을 의미한다.이 모든 것을 감안하면 캐시는 당연히 의미가 있다.
Sitecore는 HTML 캐시 렌더링 (HTML 캐시) 을 위한 매우 간단하고 쉬운 방법을 제공하기 때문에 이를 활용하는 것은 의미가 있습니다.발표가 발생하면 캐시가 효력을 상실한다는 것을 기억해야 한다.대량의 발표가 있으면 제목이 빈번히 줄어든다는 뜻이다.설령 좋은 백엔드 데이터 모델을 구축했다 하더라도 이것은 가장 좋은 장면이 아니다!

연구하다


구글에서 도움을 찾았는데, 나는 이것이 Sitecore의 기본 시간 초과 (00:00, 즉 영원) 를 대체할 것이라고 발견했다.이것은 확실히 효과가 있었다...나는 그것을 설정했다. 삽입 5분 초과, 캐시는 확실히 5분에 한 번씩 효력을 상실한다.내가 발표하지 않으면 그것은 여전히 무효다.
좋은 ol'Sitecore Slack에 대해 물어봤습니다. 발표할 때 렌더링이 줄어드는 것을 피할 수 있는 방법이 있는지 확인해 보았습니다. 상자를 열면 바로 사용할 수 있는 방법은 없습니다.나는 캐시를 제거하는 방법을 깊이 연구하려고 했지만, 좋은 결과는 없었다.그리고 나는 캐시 방법 자체, 즉 실제 getter와setter를 연구하여 그 중의 비밀을 발견했다.

솔루션



getter (RenderFromCache 와setter (AddRecordedHtmlToCache 내부에서, 기본적으로 현재 사이트 상하문을 사용하여 캐시를 저장합니다.그러나 이런 방법은 모두 가상적이기 때문에 개발자가 변경할 수 있다.그래서 나는 한 가지 생각이 들었다...캐시를 현재 사이트에 저장하지 않고 다른 사이트에 저장하는 경우...하나는 출판할 때 썩지 않습니까?우리 이 노란 벽돌길을 따라 시작합시다!

1단계: 필드 정의 만들기


너는 완전한 현장 프로젝트를 필요로 하지 않는다. 이를 위해 간단한 사이트 정의일 뿐이다.실제로 필요한 경우 다음과 같이 기존 사이트 정의를 상속할 수 있습니다.
<site name="cachingSite" inherits="website" hostName="cachingSite" cacheHtml="true" htmlCacheSize="300MB" allowDebug="false" enablePreview="false" enableWebEdit="false" enableDebugger="false" preventHtmlCacheClear="true" patch:after="site[@name='website']" />
여기서 관건적인 요소는 cacheHtmltrue로 설정하고 preventHtmlCacheClear설정도true로 설정하는 것이다.(주의, preventHtmlCacheClear 9.3 이상 버전은 새로운 것입니다.그 전에 게시할 때 캐시를 지워야 하는 사이트를 명확하게 설명해야 합니다.우리는 근본적으로 이러기를 원하지 않기 때문에, 이것은 두 가지 상황을 포함한다.)내가 설정한 값hostName은 영원히 활성화되지 않는 이름을 주기 위해서이기 때문에 여기는'진실한'사이트가 하나도 없다.

2단계: 설정


나는 이 때문에 세 가지 설정을 보류했다.
  • TimeoutRenderingParam - 캐시 시간 초과 필드의 ID
  • TimeoutRenderingKey - 캐시에 추가할 키의 이름
  • CachingSite - 캐시 사이트의 사이트 이름(위부터)
  • 이렇게 하면 코드가 유연성을 가지기 때문에 Timeout 필드를 사용하는 렌더링은 캐시 사이트를 자동으로 사용합니다.
    using Sitecore.Data;
    
    namespace Foundation.Caching {
        public struct Settings {
            public static ID TimeoutRenderingParam => new ID("{38A43E35-17D1-4D45-B399-9EA66C94B861}");
            public static string TimeoutRenderingKey => "timeout";
            public static string CachingSite => "cachingSite";
        }
    }
    

    3단계: GenerateCacheKey


    시간 초과 필드를 입력하면 기본 Sitecore 구현을 덮어쓰고 캐시 키 값을 추가합니다.
    using Sitecore.Data.Items;
    using Sitecore.Mvc.Pipelines.Response.RenderRendering;
    using Sitecore.Mvc.Presentation;
    
    namespace Foundation.Caching.Pipelines.Renderings {
        public class GenerateCacheKey : Sitecore.Mvc.Pipelines.Response.RenderRendering.GenerateCacheKey {
            public GenerateCacheKey(RendererCache rendererCache) : base(rendererCache) {
            }
    
            protected override string GenerateKey(Rendering rendering, RenderRenderingArgs args) {
                string cacheKey = base.GenerateKey(rendering, args);
                Item renderingItem = rendering.RenderingItem.InnerItem;
    
                //If the timeout rendering parameter exists and has a value, add a token to the cache key that it's present
                if (!string.IsNullOrEmpty(renderingItem[Settings.TimeoutRenderingParam])) {
                    cacheKey += $"_#{Settings.TimeoutRenderingKey}:1";
                }
    
                return cacheKey;
            }
        }
    }
    

    4단계: AddRecordedHtmlToCache


    이것은 "setter"코드입니다.시간 초과 캐시 키가 있으면 코드는 상하문 사이트가 아닌 HTML을 저장하기 위해 캐시 사이트를 사용합니다.
    using System;
    using Sitecore.Caching;
    using Sitecore.Diagnostics;
    using Sitecore.Mvc.Pipelines.Response.RenderRendering;
    using Sitecore.Sites;
    
    namespace Foundation.Caching.Pipelines.Renderings {
        public class AddRecordedHtmlToCache : Sitecore.Mvc.Pipelines.Response.RenderRendering.AddRecordedHtmlToCache {
            public override void Process(RenderRenderingArgs args) {
                Assert.ArgumentNotNull(args, nameof(args));
                if (!args.Rendered) { return; }
                string cacheKey = args.CacheKey;
                if (!args.Cacheable || string.IsNullOrEmpty(cacheKey)) { return; }
                UpdateCache(cacheKey, args);
            }
    
            protected override void AddHtmlToCache(string cacheKey, string html, RenderRenderingArgs args) {
                //Check if the Timeout key is in the cache key; if not, try the base/Sitecore version
                if (!cacheKey.Contains(Settings.TimeoutRenderingKey)) {
                    base.AddHtmlToCache(cacheKey, html, args);
                    return;
                }
    
                //Check if the Timeout value is present and a valid TimeSpan; if not, try the base/Sitecore version
                bool timeoutValue = TimeSpan.TryParse(args.Rendering.RenderingItem.InnerItem[Settings.TimeoutRenderingParam], out _);
    
                if (!timeoutValue) {
                    base.AddHtmlToCache(cacheKey, html, args);
                    return;
                }
    
                //Check if the caching site exists; if not, try the base/Sitecore version
                SiteContext cachingSite = SiteContext.GetSite(Settings.CachingSite);
    
                if (cachingSite == null) {
                    base.AddHtmlToCache(cacheKey, html, args);
                    return;
                }
    
                //Check if the HTML cache is available in the caching site; if not, try the base/Sitecore version
                HtmlCache htmlCache = CacheManager.GetHtmlCache(cachingSite);
    
                if (htmlCache == null) {
                    base.AddHtmlToCache(cacheKey, html, args);
                    return;
                }
    
                //If everything is good, set the timeout based on the rendering parameter and put the HTML in the caching site
                TimeSpan timeout = GetTimeout(args);
                htmlCache.SetHtml(cacheKey, html, timeout);
            }
    
            protected override TimeSpan GetTimeout(RenderRenderingArgs args) => TimeSpan.TryParse(args.Rendering.RenderingItem.InnerItem[Settings.TimeoutRenderingParam], out TimeSpan result) ? result : args.Rendering.Caching.Timeout;
        }
    }
    

    5단계: RenderFromCache


    이것은 "getter"코드입니다.시간 초과 캐시 키가 있으면 코드는 캐시 사이트의 HTML을 검사합니다.
    using System.IO;
    using Sitecore.Abstractions;
    using Sitecore.Caching;
    using Sitecore.Mvc.Pipelines.Response.RenderRendering;
    using Sitecore.Mvc.Presentation;
    using Sitecore.Sites;
    
    namespace Foundation.Caching.Pipelines.Renderings {
        public class RenderFromCache : Sitecore.Mvc.Pipelines.Response.RenderRendering.RenderFromCache {
            public RenderFromCache(RendererCache rendererCache, BaseClient baseClient) : base(rendererCache, baseClient) {
            }
    
            protected override bool Render(string cacheKey, TextWriter writer, RenderRenderingArgs args) {
                //Check if the Timeout key is in the cache key; if not, try the base/Sitecore version
                if (!cacheKey.Contains(Settings.TimeoutRenderingKey)) {
                    return base.Render(cacheKey, writer, args);
                }
    
                //Check if the caching site exists; if not, try the base/Sitecore version
                SiteContext cachingSite = SiteContext.GetSite(Settings.CachingSite);
    
                if (cachingSite == null) {
                    return base.Render(cacheKey, writer, args);
                }
    
                //Check if an HTML cache exists for the caching site and that the HTML is present; if not, try the base/Sitecore version
                HtmlCache htmlCache = CacheManager.GetHtmlCache(cachingSite);
                string html = htmlCache?.GetHtml(cacheKey);
    
                if (html == null) {
                    return base.Render(cacheKey, writer, args);
                }
    
                //If everything is good, write the HTML from the cache
                writer.Write(html);
    
                return true;
            }
        }
    }
    

    단계 6: 파이프 구성


    마지막으로, 이 모든 것을 패치 파일에 연결해서 적당한 내장 파이프를 덮어써야 합니다.
    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:set="http://www.sitecore.net/xmlconfig/set/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:env="http://www.sitecore.net/xmlconfig/env/">
      <sitecore>
          <pipelines>
                <mvc.renderRendering>
                    <processor type="Foundation.Caching.Pipelines.Renderings.RenderFromCache, Foundation.Caching" resolve="true" patch:instead="processor[@type='Sitecore.Mvc.Pipelines.Response.RenderRendering.RenderFromCache, Sitecore.Mvc']" />
                    <processor type="Foundation.Caching.Pipelines.Renderings.AddRecordedHtmlToCache, Foundation.Caching" patch:instead="processor[@type='Sitecore.Mvc.Pipelines.Response.RenderRendering.AddRecordedHtmlToCache, Sitecore.Mvc']" />
                    <processor type="Foundation.Caching.Pipelines.Renderings.GenerateCacheKey, Foundation.Caching" resolve="true" patch:instead="processor[@type='Sitecore.Mvc.Pipelines.Response.RenderRendering.GenerateCacheKey, Sitecore.Mvc']" />
                </mvc.renderRendering>
          </pipelines>
      </sitecore>
    </configuration>
    

    비밀번호!


    코드로 Github 프로젝트를 만들었습니다.Sitecore 패키지에 새 필드가 포함되어 있으며, 원하는 순서대로 필드를 추가할 수 있습니다.자세한 내용은 설명 파일을 참조하십시오.

    kmac23va / 토대캐시


    Sitecore Helix 모듈, 시간 초과 만료를 위한 내장 캐시 확장


    토대캐시


    이 모듈은 시간 초과 파라미터를 추가하기 위해 Sitecore의 캐시 기능을 확장하기 위한 것입니다.값을 삽입하면 렌더링은 지정된 시간이 끝날 때만 캐시를 종료하고 컨텐트가 발표될 때만 종료되지 않습니다.

    설치


    모듈 코드를 솔루션에 추가합니다(파일 가져오기 또는 나선 모듈로).포함된 Sitecore 패키지를 실행하여 시간 초과 필드를 추가합니다.그런 다음 기본 설정 도구(TDS, Unicorn, CLI)를 사용하여 이 필드를 소스 코드 관리에 통합할 수 있습니다.

    메모

  • 이 모듈은 Sitecore 10Sitecore.Mvc을 사용하여 구성을 참조합니다.솔루션에 따라 적절하게 변경할 수 있습니다.
  • 캐시 사이트 정의는 preventHtmlCacheClear 속성으로 설정됩니다.이 모듈을 9.2 이하 버전의 사이트에 사용할 경우 게시: 캐시 정리 종료에 포함되지 않기 때문에 추가 작업을 수행할 필요가 없습니다.
  • 추가 정보


    blog post 를 참조하십시오.
    View on GitHub

    좋은 웹페이지 즐겨찾기