使用缓存依赖项在 EPiServer CMS 7.5 中缓存对象
Caching objects in EPiServer CMS 7.5 with cache dependencies
我想存储一小部分对象并创建对网站起始页的依赖。因此,当起始页被改变时强制缓存失效。使用旧的缓存实现很容易做到这一点,现在已弃用。
documentation 说我应该使用 CacheEvictionPolicy class。但我无法弄清楚如何使用此 class.
设置依赖项
我的问题是:
如何在 EPiServer 7.5 中缓存依赖于 EPiServer 内容 (IContent) 的对象(不使用已弃用的方法并包括 Web 服务器之间的无效消息功能)?
您应该能够使用 DataFactoryCache.CreateDependency() 创建缓存依赖项。它支持指定一个 ContentReference 作为其参数,例如 ContentReference.StartPage 以在更新起始页时清除缓存条目。
此外,其中大部分内容(尽管对于 EPiServer 6)仍然有效:http://tedgustaf.com/blog/2010/5/cache-objects-in-episerver-with-page-dependencies/
除非我误解了你需要达到的目标?
编辑: 对于 EPiServer 7.5+,您应该使用 CacheEvictionPolicy,例如:
EPiServer.CacheManager.Insert(
key,
item,
new CacheEvictionPolicy(
new List<string>() { DataFactoryCache.PageCommonCacheKey(dependencyLink) }
)
);
我设法解决了这个问题。使用找到的方法 here.
我创建了一个简单的实现(非线程安全):
private static ISynchronizedObjectInstanceCache _cacheInstance;
public static ISynchronizedObjectInstanceCache CacheImplementation
{
get
{
return (_cacheInstance ?? (_cacheInstance = ServiceLocator.Current.GetInstance<ISynchronizedObjectInstanceCache>()));
}
set
{
_cacheInstance = value;
}
}
public IList<MyObject> GetCachedObjects()
{
if (_cachedObjects == null)
{
object value = CacheImplementation.Get("MyObjectsCacheKey");
if (value == null)
{
// Lookup objects (the slow function that triggered the need for caching)
_cachedObjects = LookupMyObjects();
string currentLanguage = ContentLanguage.PreferredCulture.Name;
// Create dependencies and add to cache
List<string> cacheDependencyKeys = new List<string>();
// Add dependency to the start page
cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(ContentReference.StartPage, currentLanguage));
// Add dependency to the pointed out startpoint of the lookup of "MyObjects" (if not null)
// This will force a cache invalidation when the page itself or it's children are changed.
if (CurrentPage.MyObjectsStartPoint != null)
{
cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(CurrentPage.MyObjectsStartPoint, currentLanguage));
cacheDependencyKeys.Add(DataFactoryCache.ChildrenCacheKey(CurrentPage.MyObjectsStartPoint));
}
// Do insert into cache
CacheImplementation.Insert("MyObjectsCacheKey", _cachedObjects, new CacheEvictionPolicy(cacheDependencyKeys.ToArray()));
} else
{
_cachedObjects = value as IList<MyObject>;
}
}
return _cachedObjects;
} private IList<MyObject> _cachedObjects = null;
编辑: 更改为 ISynchronizedObjectInstanceCache 而不是 IObjectInstanceCache。 EPiServer 的 "CacheManager"-class 使用此实现,并且应该与服务器之间的缓存失效一起使用。
我想存储一小部分对象并创建对网站起始页的依赖。因此,当起始页被改变时强制缓存失效。使用旧的缓存实现很容易做到这一点,现在已弃用。
documentation 说我应该使用 CacheEvictionPolicy class。但我无法弄清楚如何使用此 class.
设置依赖项我的问题是: 如何在 EPiServer 7.5 中缓存依赖于 EPiServer 内容 (IContent) 的对象(不使用已弃用的方法并包括 Web 服务器之间的无效消息功能)?
您应该能够使用 DataFactoryCache.CreateDependency() 创建缓存依赖项。它支持指定一个 ContentReference 作为其参数,例如 ContentReference.StartPage 以在更新起始页时清除缓存条目。
此外,其中大部分内容(尽管对于 EPiServer 6)仍然有效:http://tedgustaf.com/blog/2010/5/cache-objects-in-episerver-with-page-dependencies/
除非我误解了你需要达到的目标?
编辑: 对于 EPiServer 7.5+,您应该使用 CacheEvictionPolicy,例如:
EPiServer.CacheManager.Insert(
key,
item,
new CacheEvictionPolicy(
new List<string>() { DataFactoryCache.PageCommonCacheKey(dependencyLink) }
)
);
我设法解决了这个问题。使用找到的方法 here.
我创建了一个简单的实现(非线程安全):
private static ISynchronizedObjectInstanceCache _cacheInstance;
public static ISynchronizedObjectInstanceCache CacheImplementation
{
get
{
return (_cacheInstance ?? (_cacheInstance = ServiceLocator.Current.GetInstance<ISynchronizedObjectInstanceCache>()));
}
set
{
_cacheInstance = value;
}
}
public IList<MyObject> GetCachedObjects()
{
if (_cachedObjects == null)
{
object value = CacheImplementation.Get("MyObjectsCacheKey");
if (value == null)
{
// Lookup objects (the slow function that triggered the need for caching)
_cachedObjects = LookupMyObjects();
string currentLanguage = ContentLanguage.PreferredCulture.Name;
// Create dependencies and add to cache
List<string> cacheDependencyKeys = new List<string>();
// Add dependency to the start page
cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(ContentReference.StartPage, currentLanguage));
// Add dependency to the pointed out startpoint of the lookup of "MyObjects" (if not null)
// This will force a cache invalidation when the page itself or it's children are changed.
if (CurrentPage.MyObjectsStartPoint != null)
{
cacheDependencyKeys.Add(DataFactoryCache.PageLanguageCacheKey(CurrentPage.MyObjectsStartPoint, currentLanguage));
cacheDependencyKeys.Add(DataFactoryCache.ChildrenCacheKey(CurrentPage.MyObjectsStartPoint));
}
// Do insert into cache
CacheImplementation.Insert("MyObjectsCacheKey", _cachedObjects, new CacheEvictionPolicy(cacheDependencyKeys.ToArray()));
} else
{
_cachedObjects = value as IList<MyObject>;
}
}
return _cachedObjects;
} private IList<MyObject> _cachedObjects = null;
编辑: 更改为 ISynchronizedObjectInstanceCache 而不是 IObjectInstanceCache。 EPiServer 的 "CacheManager"-class 使用此实现,并且应该与服务器之间的缓存失效一起使用。