ObjectCache 的使用
Cache的获取及定义
Cache的获取代码:
var cache = CacheManager.Instance.GetCache<KeyType, ValueType>();
因此对Cache的定义,实际上就是对KeyType和ValueType的定义,例如:
class Key :IEquatable<Key> { public string Id{get;set;} public bool Equals(Key other) { if(other == null) return false; return Id == other.Id; } class BusinessObj { /* property definitions*/ }
有了以上两个类型,我们就可以用来创建/获取cache了。
var cache = CacheManager.Instance.GetCache<Key, BusinessObj>();
Cache的作用范围
由于Cache的定义实际上是通过强类型来定义的,如上面的代码GetCache<Key, BusinessObj>()。因此Cache的作用范围等同于上面定义的类型Key和BusinessObj的作用范围。
Cache生命周期的管理
Cache生命周期的管理问题实际上就是控制cache的内容在何时失效。
有以下两种方式来控制cache内容何时失效,cache的内容一旦失效,它就会被从内存中移除
1. 可以通过继承BaseToken来管理
2. 直接调用ICache上的Reset()方法来清空Cache中的所有内容
3. 直接调用ICache上的Remove()方法来指定移除某一个CacheItem
Cache的分组
对Cache分组的目的是,我们可以对同一组别的Cache进行清空处理。Cache的分组信息通过特性定义在Cache的Key上面。请参见以下代码:
[CacheKeyCategory(2)] class CackeKey2 : IEquatable<CackeKey2> { public long Id { get; set; } #region IEquatable<CacheKey> Members public bool Equals(CackeKey2 other) { return Id == other.Id; } #endregion }
我们可以通过如下单元测试来看清楚其作用
[TestMethod] public void CacheCategory_Category_Test() { var cache = CacheManager.Instance.GetCache<CackeKey2, string>(); cache.GetWithCreate(new CackeKey2 { Id = 1 }, () => "Hello", new BaseToken()); Assert.AreEqual(1, cache.Count()); CacheManager.Instance.ResetCaches(4); Assert.AreEqual(1, cache.Count()); CacheManager.Instance.ResetCaches(2); Assert.AreEqual(0, cache.Count()); }当CacheManager.Instance.ResetCaches(4)被调用时,Cache<CacheKey2,string>中的内容并没有被清空。当
CacheManager.Instance.ResetCaches(2)被调用时,Cache<CacheKey2,string>中的内容才被清空。
如果Cache的key没有添加分组信息,那么只有当CacheManager.Instance.ResetCaches(0);被调用时,Cache中的内容才会被清空,且实际上,这是所有的缓存都会被清空。