缓存子系统如何设计(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对象的实现
结构图如下:
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 对象
, 缓存
, 缓存机制
, 缓存系统
, memcache
, value
, 代理memcache
, 缓存设计
子系统
垂直干线子系统设计、工作区子系统设计、设备间子系统设计、建筑群子系统设计、水平子系统设计内容,以便于您获取更多的相关知识。