系统Cache的批量删除

这里的Cache指的是MS的.NET缓存,我称为OS Cache 或是系统缓存。

OS Cache缓存的批量清空一直是个头疼的问题。举个例子我们根据城市缓存商户信息。也就是说CacheKey = DianPing.Shop.@CityID.@ShopID 那么有时候我们希望清空特定@CityID的商户信息。以前是不好处理的,因为我们不知道,到底有那些CacheKey可以删除(PS:MS没有提供HttpContext.Current.Cache.Items)。

最近自己在处理二级代理的问题时无意中发现 OS Cache 是这样定义的:

public sealed class Cache : IEnumerable

看到了IEnmberable 接口了吗!另人兴奋的接口。以前怎么没注意到呢?有了这个我可以获取到所有的CacheKey啦。以前一直认为的无法获得的CacheKey可以拿到了。有了CacheKey只要调用Cache.Remove(CacheKey)就可以完成清空任务了。那么这里我还需要一些正则表达式的规则,因为需要正则去匹配符合规则的Cachekey。不多说了,看代码:

public static void RemoveByRegex(string pattern)
    {
        IDictionaryEnumerator em = HttpContext.Current.Cache.GetEnumerator();
        Regex regex = new Regex(pattern, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
        while (em.MoveNext())
        {
            if (regex.IsMatch(em.Key.ToString()))
            {
                HttpContext.Current.Cache.Remove(em.Key.ToString());
            }
        }
    }

再提供一个清空所有缓存的方法,不用重新上传WebConfig啦.原理是一样的啦!

public static void Clear(string pattern)
   {
       IDictionaryEnumerator em = HttpContext.Current.Cache.GetEnumerator();
       while (em.MoveNext())
       {
           HttpContext.Current.Cache.Remove(em.Key.ToString());
       }
   }

 

(*^__^*),搞定。给我一个正则,我可以清空一片缓存。通过正则表达式批量删除系统缓存的方法完成,一直头疼的问题应该可以解决了。

这里还有几个想到的问题:

  • 批量删除是通过循环去做的,如果一个系统有百万级的KEY,这是有开销的。但反过来想,如果真这么多Key是否是Cache使用不当,有必要这样浪费Key。周一回公司,测试一下我们系统目前大概使用了多少KEY。
  • 想到了敬德在MemCache 中为了解决批量删除,对CacheKey通过SQLDB存储的。不知道MemCache是否有类似的接口。
  • 对Cache的操作是应该有一个类封装了。第一:可以缩短HttpContext.Current.Cache.Add(CacheKey, cityList, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null); 缓存一个城市列表用了这么长的表达式。第二:可以将我上面的两个方法放入WebCache类中,因为现在没封装,我这两个新方法不知道放哪里!

 

Google 标记: Cache删除, Cache缓存

你可能感兴趣的:(C#/ASP.NET)