上下文:
网站随着访问量的加大,会逐步在前端加上CDN和Nginx,对页面进行缓存.
这样原来很多使用Memcached做分布式缓存的,有很多就不太具有缓存的必要了.
所以在此征集一些大家在Memcached使用时的一些最佳实践和做法.
最后还是要声明:不要人云亦云,不要灌水.谢谢
问题:
1.如果前端已经使用了Nginx,哪些类型的页面你会在取数据时使用Memcached缓存数据,哪些不会.缓存的时间是多久,基于什么原因和实践?
2.哪些使用Memcached缓存的数据你会加缓存依赖?
3.你的Memcached缓存依赖关系是怎么设计的,又如何存储?
我的前一个提问有涉及这个部分的讨论: http://q.cnblogs.com/q/63451/
@Launcher的最后建议是:你先得把你的依赖关系设计好了,把数据流或活动流程给描绘清楚了,然后再考虑用什么数据结构表示,如何持久化,怎样实现分布式,如何容错等其它问题。
你有什么好的思路?也欢迎@Launcher继续精彩的回复.
4.一般的电商网站会涉及到类似如下表:商品,分类,商品价格,商品图片,商品分类关系,商品促销,商品发货区域...
在站点首页,往往会有一些推荐分类,显示的商品会需要查询到这些表.
直接查询压力会施加到db,所以可以缓存,也可以通过Nginx做反向代理进行缓存.大家是怎么做的?
另外如果商品价格变了,或是促销价格变了,或者商品限制了发货区域...你是怎么去处理的?
是直接设置一个短的缓存时间还是通过缓存主动更新和缓存依赖联合去解决?亦或是什么其他的策略.
问题3中@Launcher有提到:把数据流或活动流程给描绘清楚,我觉得很中肯,你的程序中的数据又是如何去梳理的呢?
另外常听到一部分人提说你架构有问题,把数据都灌到内存中维护一个叫做“索引”的内存数据库, 具体又应该怎么取做的呢?
4个问题可以选择其中一个或某一个点回答。只要是给出了好的意见的,某一个点上最好的那个回答都可获得园豆。虽然园豆不能完全表达谢意,但你的回答和分享会帮助到所有交流其中的人。
主要还是缓存使用的问题,我觉得缓存不是全部··有的业务对实时性要求高了。那缓存怎么使用。
在能使用缓存的场合,就是像之前说的那样在数据访问层实现CQRS 然后用AOP实现缓存是最好的。
个人觉得CQRS比较适合业务成熟度比较高的产品类项目中实施。像电商,尤其是发展比较快的一些行业,活动促销等一大堆的业务变动.今天提需求明天要上线.设计很难这么规范,老板只管要结果,不到系统出现严重的性能瓶颈,他不会去管。比如你打算把一乱七八糟的页面规范下重写,才写了3,4天老板就催领导了。以前改版都是一礼拜,啊,你现在都还没改完,是不是能力有问题啊。即使你辛辛苦苦把一堆混乱的东西重构好了调顺了,不出3月,新来的人就能给你改的面目全非。到最后实在改不下去了,丢回来给你,这个好像最初你写的,现在不能用了,你给解决下。半天应该可以搞定的啊,什么?1周?人家新来的改版整个项目一周都够了。哭笑不得啊.这也是为什么很多项目最后做的那么烂的原因。
回头说你的答复,往更深一点去说.数据不是无联系的,Command处理的大多是单个Model,CQRS还要涉及到更新的事件,而缓存的数据一般是ViewModel的样子,他们之间还应该是有一个转换的(比如商品价格,促销价格,商品发货区域,尤其是商品分类 变化了,你如何去更新缓存)。这个部分你是如何设计的呢?
@Tim Lee: 前面的问题是由于认为造成,
后面的问题,viewmodel到model没有直接转换吧,本来是根据业务在ui层拼装viewmodel的
@吴瑞祥: 这个地方可能我表述太模糊,我指的Model和ViewModel的样子可以这么理解:你在后台操作的大都是单表,而前端显示是多表视图的一个展示。比如:你在后台更新了商品的促销价格,商品促销价和商品表不是一张表,这时很显然促销和商品之间有依赖,我想知道的是:你在CQRS里面是怎么去建这个依赖关系的(前提:是memecached做缓存),又是怎么去更新缓存的.
或者更直接地说:如果是你用memcached做缓存,上面的这个问题你怎么处理?
也就是依赖关系怎么设计,又如何存储?
@Tim Lee: 嗯,这个问题是要看你缓存的是什么了.
是业务缓存,还是数据层缓存.
数据层缓存对开发的影响可以做到很小.当数据库访问层实现CQRS,就可以通过AOP来实现整个数据层的缓存.
业务缓存不推荐,因为整体会变得很混乱
@吴瑞祥: AOP没有问题,同意的.但你还是没回答我的问题:依赖关系怎么设计,又如何存储?
我主要是想知道你是怎么处理缓存依赖的问题的。
@Tim Lee: 将dal方法分为2类,查询和数据库操作.
在调用 数据库操作 的方法时让这个表的所有缓存失效.这样效率比较低```但实现起来比较块.
@吴瑞祥: 其实我从一开始到现在问你的都是一个问题:memcached的缓存依赖你具体是怎么设计?怎么储存的?
@Tim Lee: 上面那个就是缓存依赖啊.
缓存依赖就是缓存失效.储存的是整个表