week5. 总结心得
这周主要学习了分布式缓存架构、消息队列与异步架构
这里我主要罗列些对自己有较大的感触点:
1、什么是缓存Cache
缓存:存储在计算机上的一个原始数据复制集,以便于访问 - 维基百科
缓存是介于数据访问者和数据源之间的一种高速存储,当数据需要多次读取的时候,用于加快读取的速度。
2、无处不在的缓存:
CPU缓存
操作系统缓存
数据库缓存
JVM编译缓存
CDN缓存
代理与反向代理缓存
应用程序缓存
分布式对象缓存
3、缓存的关键指标
缓存命中率
缓存是否有效依赖于能多少次重用同一个缓存响应业务请求,这个度量指标被称作缓存命中率。
如果查询一个缓存,十次查询九次能够得到正确结果,那么它的命中率是90%。
影响缓存命中率的主要指标有:
缓存键集合大小
缓存可使用内存空间
缓存对象生存时间
4、缓存大概分为两种:通读缓存、旁路缓存
通读缓存:代理缓存,反向代理缓存,CDN缓存都是通读缓存;
通读缓存给客户端返回缓存资源,并在请求未命中缓存时获取实际数据。
客户端连接的是通读缓存而不是生成响应的原始服务器。
旁路缓存:对象缓存是一种旁路缓存,通常是一个独立的键值对(key-value)存储;
应用代码通常会询问对象缓存需要的对象是否存在,如果存在,它会获取并使用缓存的对象,如果不存在或已过期,应用会连接主数据源来组装对象,并将其保存回对象缓存中以便将来使用。
5、技术栈各个层次的缓存:
6、缓存是系统性能优化的大杀器:技术简单、性能提升显著、应用场景多,需要合理使用缓存:
6.1、使用缓存对提高系统性能有很多好处,但是不合理的使用缓存可能非但不能提高系统的性能,还会成为系统的累赘,甚至风险。实践中,缓存滥用的情景屡见不鲜:过分依赖缓存、不合适的数据访问特性等;
6.2、频繁修改的数据:这种数据如果缓存起来,由于频繁修改,应用还不及读取就已失效或更新,徒增系统负担。一般来说,数据的读写比在2:1以上,缓存才有意义;
6.3、没有热点的访问:缓存使用内存作为存储,内存资源宝贵而有限,不能将所有数据都缓存起来,如果应用系统访问数据没有热点,不遵循二八定律,即大部分数据访问不是集中在小部分数据上,那么缓存就没有意义,因为大部分数据还没有被再次访问就已经被挤出缓存了。
6.4、数据不一致与脏读:一般会对缓存的数据设置失效时间,一旦超过失效时间,就要从数据库重新加载。因此应用要容忍一定时间的数据不一致,如卖家已经编辑了商品属性,但是需要过一段时间才能被买家看到。在互联网应用中,这种延迟通常是可以接受的,但是具体应用仍需慎重对待。还有一种策略是数据更新时立即更新缓存,不过也会带来更多系统开销和事务一致性的问题。因此数据更新时通知缓存失效,删除该缓存数据,是一种更加稳妥的做法。
7、Redis 集群,目前是较主流的缓存组件;
8、消息队列与异步架构主要是需要充分掌握:同步调用与异步调用的场景;
评论