【架构师训练营 1 期】第五周学习总结
本周知识点回顾及总结:
缓存Cache:(原始数据的复制集)当数据需要多次读取时,用于加快读取速度。
缓冲Buffer:类似"懒读懒写"。用于应用程序和低速存储设备间的缓冲数据。
缓存数据存储:理解Hash表原理,时间复杂度O(1)。
工作案例:
在客运票务系统中,使用缓存(Cache) 存入线路信息、车辆信息、班次信息等(频繁查询的数据),在周末或节假日前后访问量增大时能有效提高查询速度,缓解数据库压力。使用缓冲(Buffer)记录订票信息、改签信息、座位更新信息等,在夜间(访问量小时)再把缓冲的数据写入数据库中,从而充分利用计算资源同时缓解数据库压力。
影响缓存命中率的主要指标:
缓存键集合大小:应用生成的键越多重用机会越少(键的数量越少,缓存效率越高)。
缓存可使用内存空间:物理上能缓存的对象越多,缓存命中率越高。
缓存对象生存时间:对象缓存的时间越长,缓存对象被重用的可能性就越高,缓存命中率就越高。
代理缓存:代理用户上网的服务器(用户一端)。
反向代理缓存:数据中心的代理服务器,降低应用服务器的负载。
多层反向代理缓存:(个人理解)外部流量——>负载均衡——>反向代理服务器——>前端服务器——>反向代理服务器——>后端服务器。
内容分发网络:静态资源就近访问(需要接入各服务商的CDN服务)。
通读缓存:客户端只连接通读缓存,由通读缓存返回资源(无缓存则由通读缓存向原始服务器获取数据并写入缓存)。
旁路缓存:客户端分别连接旁路缓存和原始服务器,由客户端先检查旁路缓存里有无数据,没有则向原始服务器去获取并写入旁路缓存。
浏览器对象缓存:是一种旁路缓存。
本地对象缓存:1、缓存在应用程序内存中;2、缓存在同一服务器(多进程共享)内存中;3、独立缓存服务和独立应用程序部署在同一服务器上通过本地网络通信访问缓存服务。
远程分布式对象缓存:(有利于线性伸缩)
Memcached分布式对象缓存:每个客户端通过路由算法(类似HashCode对X取模运算,但对线性扩容存在问题)计算写入哪一台缓存服务器,每台服务器缓存的数据不同。
一致性哈希算法图示:(无虚拟节点)
的一致性哈希算法图示:(基于虚拟节点)
各个层次的缓存图示:
适合使用缓存的场景:频繁读,少量写。
缓存的数据不一致与脏读:(修改数据之后一段时间内,没有及时更新缓存,这个时间应是一个可容忍的时间)通过设置失效时间,或及时更新缓存(会产生额外的系统开销和事务一致性问题)。所有数据更新时通知缓存失效,删除该缓存,是一种更稳妥的做法。另外可以使用LRU算法(缓存淘汰机制)。
缓存雪崩:缓存失效等问题,导致访问压力直接访问数据库。
缓存预热:提前加载好热点数据的缓存。
缓存穿透:恶意访问不存在的缓存(或业务自身造成),直接打到数据库上。解决方法是即便访问的数据不存在,也可以写入缓存并存入null。
评论