缓存处理

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
    • 按当前请求的地址, 参数和表单参数隔离缓存