缓存子系统的设计方法2014-06-11 cnblogs Aaron缓存子系统如何设计(Cachable tag, Memcache/redis support, xml config support, LRU/LFU/本地缓存命中率)大家对这段代码肯定很熟悉吧:
public List<UserInfo> SearchUsers(string userName){string cacheKey=string.Format("SearchUsers_{0}", userName);List<UserInfo>users = cache.Find(cacheKey) as List<UserInfo>;if (users == null){users = repository.GetUsersByUserName(userName);cache.Set(cacheKey, users);}return users;}class HttpRuntimeCache{public object Find(string key){return HttpRuntime.Cache[key];}public void Set(string key, object value){HttpRuntime.Cache[key] = value;}}
导致了如下这些问题:业务逻辑函数中引入了很多无关的缓存代码,导致DDD模型不够纯更换缓存Provider不方便加入缓存冗余机制不方便没办法同时使用多个缓存系统缓存大对象出现异常,比如Memcache有1M的value限制有诸多问题,因此我们需要引入缓存子系统来解决上述问题,带来的好处:DDD模型更加纯具体的Cache实现机制可以很灵活,比如HttpRuntimeCache, Memcache, Redis 可以同时使用加入了Cache冗余机制,不会由于某一台Memcache或者Redis down机导致系统 速度很慢,实际上,系统还是会保持飞快(除非backup也down了的情况)开发人员更加致力于核心业务,不会分散注意力缓存位置透明化,都会在xml配置文件中进行配置解决方案,要用到这2篇文章的技术:C# 代理应用 - Cachable 和 聊聊 Memcached的应用。主要的思路分2个:模型端:通过代理来嵌入AOP方法,来判断是否需要缓存,有缓存value则直接 返回value;缓存value的写入是通过AOP的后置方法写入的,因此不需要在业务函 数中写代码,当然也支持代码调用。Cache核心对象:这个对象要解决一致性hash算法、cache value大对象分解功 能、冗余机制代理嵌入AOP的方法,已经在这篇文章中说明了 C# 代理应用 - Cachable,有 兴趣的看看,这里就不说了,我们来主要看看CacheCoordinator对象的实现结构图如下: