缓存处理


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