缓存处理
ZKWeb提供了标准的缓存接口, 可以统一缓存的操作.
默认缓存对象都保存在内存中, 可以自己实现ICacheFactory
来支持分布式的缓存.
缓存接口的类型是IKeyValueCache<TKey, TValue>
, 通过ICacheFactory
可以创建新的缓存对象.
public interface IKeyValueCache<TKey, TValue> { void Put(TKey key, TValue value, TimeSpan keepTime); bool TryGetValue(TKey key, out TValue value); void Remove(TKey key); int Count(); void Clear(); }
创建缓存
创建缓存需要调用ICacheFactory.CreateCache
, 可以指定创建的参数CacheFactoryOptions
CacheFactoryOptions.Lifetime
为缓存的生命周期, 有持久和跟随Http请求销毁.
CacheFactoryOptions.IsolationPolicies
为隔离策略, 请参考下面的说明.
var cacheFactory = Application.Ioc.Resolve<ICacheFactory>(); var cache = cacheFactory.CreateCache<int, string>();
缓存的隔离
ZKWeb提供了一套隔离缓存的机制, 可以按当前的上下文隔离缓存.
例如缓存翻译结果时, 一般应该使用cache[当前语言][原文] = [译文]
,
但使用缓存隔离功能后, 可以直接使用cache[原文] = [译文]
.
创建带隔离功能的缓存
以下创建了根据当前请求的语言和Url进行隔离的缓存.
var cacheFactory = Application.Ioc.Resolve<ICacheFactory>(); var cache = cacheFactory.CreateCache<string, string>( CacheFactoryOptions.Default.WithIsolationPolicies("Url", "Locale")); cache.Put(path, renderResult, TimeSpan.FromSeconds(100));
自定义隔离策略
继承ICacheIsolationPolicy
并且注册到容器可以实现自定义的缓存策略.
缓存策略类似于Http协议中的Vary
, 可以根据不同的请求参数区分缓存的内容.
这里根据Http头中的Accept隔离.
[ExportMany(ContractKey = "Custom")] public class CustomPolicy : ICacheIsolationPolicy { public object GetIsolationKey() { return HttpManager.CurrentContext.Request.GetHeader("Accept"); } }
提供的缓存隔离策略
框架默认提供了以下的缓存隔离策略
Device
- 按当前请求的设备(电脑或手机)隔离缓存
Locale
- 按当前的语言和时区隔离缓存
Url
- 按当前请求的地址, 参数和表单参数隔离缓存