Welcome

首页 / 软件开发 / 数据结构与算法 / 缓存子系统的设计方法

缓存子系统的设计方法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对象的实现

结构图如下: