手机做网站知乎,网络建设与运维初级,网站开发培训机构排名,dw个人网站设计模板概述
在系统架构中#xff0c;缓存可谓提供系统性能的简单方法之一#xff0c;稍微有点开发经验的同学必然会与缓存打过交道#xff0c;起码也实践过。
如果使用得当#xff0c;缓存可以减少响应时间、减少数据库负载以及节省成本。但如果缓存使用不当#xff0c;则可能…概述
在系统架构中缓存可谓提供系统性能的简单方法之一稍微有点开发经验的同学必然会与缓存打过交道起码也实践过。
如果使用得当缓存可以减少响应时间、减少数据库负载以及节省成本。但如果缓存使用不当则可能出现一些莫名其妙的问题。
在不同的场景下所使用的缓存策略也是有变化的。如果在你的印象和经验中缓存还只是简单的查询、更新操作那么这篇文章真的值得你学习一下。
在这里为大家系统地讲解4种缓存模式以及它们的使用场景、流程以及优缺点。
缓存策略的选择
本质上来讲缓存策略取决于数据和数据访问模式。换句话说数据是如何写和读的。
例如: 系统是写多读少的吗例如基于时间的日志 数据是否是只写入一次并被读取多次例如用户配置文件 返回的数据总是的吗例如搜索查询
选择正确的缓存策略才是提高性能的关键。
常用的缓存策略有以下五种 Cache-Aside Pattern旁路缓存模式 Read Through Cache Pattern读穿透模式 Write Through Cache Pattern写穿透模式 Write Behind Pattern又叫Write Back异步缓存写入模式
上述缓存策略的划分是基于对数据的读写流程来区分的有的缓存策略下是应用程序仅和缓存交互有的缓存策略下应用程序同时与缓存和数据库进行交互。因为这个是策略划分比较重要的一个维度所以在后续流程学习时大家需要特别留意一下。
Cache Aside
Cache Aside是常见的缓存模式应用程序可直接与缓存和数据库对话。Cache Aside可用来读操作和写操作。
读操作的流程图 Cache Aside Pattern
读操作的流程 应用程序接收到数据查询读请求 应用程序所需查询的数据是否在缓存上 如果存在Cache hit从缓存上查询出数据直接返回 如果不存在Cache miss则从数据库中检索数据并存入缓存中返回结果数据
这里我们需要留意一个操作的边界也就是数据库和缓存的操作均由应用程序直接进行操作。
写操作的流程图 Cache Aside Pattern
这里的写操作包括创建、更新和删除。在写操作的时候Cache Aside模式是先更新数据库增、删、改然后直接删除缓存。
Cache Aside模式可以说适用于大多数的场景通常为了应对不同类型的数据还可以有两种策略来加载缓存 使用时加载缓存当需要使用缓存数据时从数据库中查询出来次查询之后后续请求从缓存中获得数据 预加载缓存在项目启动时或启动后通过程序预加载缓存信息比如”国家信息、货币信息、用户信息新闻信息“等不是经常变更的数据。
Cache Aside适用于读多写少的场景比如用户信息、新闻报道等一旦写入缓存几乎不会进行修改。该模式的缺点是可能会出现缓存和数据库双写不一致的情况。
Cache Aside也是一个标准的模式像Facebook便是采用的这种模式。
Read Through
Read-Through和Cache-Aside很相似不同点在于程序不需要关注从哪里读取数据缓存还是数据库它只需要从缓存中读数据。而缓存中的数据从哪里来是由缓存决定的。
Cache Aside是由调用方负责把数据加载入缓存而Read Through则用缓存服务自己来加载从而对应用方是透明的。Read-Through的优势是让程序代码变得更简洁。
这里就涉及到我们上面所说的应用程序操作边界问题了直接来看流程图 Read Through
在上述流程图中重点关注一下虚线框内的操作这部分操作不再由应用程序来处理而是由缓存自己来处理。也就是说当应用从缓存中查询某条数据时如果数据不存在则由缓存来完成数据的加载后再由缓存返回数据结果给应用程序。
Write Through
在Cache Aside中应用程序需要维护两个数据存储一个缓存一个数据库。这对于应用程序来说有一些繁琐。
Write-Through模式下所有的写操作都经过缓存每次向缓存中写数据时缓存会把数据持久化到对应的数据库中去且这两个操作在一个事务中完成。因此只有两次都写成功了才是终写成功了。坏处是有写延迟好处是保证了数据的一致性。
可以理解为应用程序认为后端就是一个单一的存储而存储自身维护自己的Cache。
因为程序只和缓存交互编码会变得更加简单和整洁当需要在多处复用相同逻辑时这点就变得格外明显。 Write Through
当使用Write-Through时一般都配合使用Read-Through来使用。Write-Through的潜在使用场景是银行系统。
Write-Through适用情况有 需要频繁读取相同数据 不能忍受数据丢失相对Write-Behind而言和数据不一致
在使用Write-Through时要特别注意的是缓存的有效性管理否则会导致大量的缓存占用内存资源。甚至有效的缓存数据被的缓存数据给清除掉。
Write-Behind
Write-Behind和Write-Through在”程序只和缓存交互且只能通过缓存写数据“这方面很相似。不同点在于Write-Through会把数据立即写入数据库中而Write-Behind会在一段时间之后或是被其他方式触发把数据一起写入数据库这个异步写操作是Write-Behind的大特点。
数据库写操作可以用不同的方式完成其中一个方式就是收集所有的写操作并在某一时间点比如数据库负载低的时候批量写入。另一种方式就是合并几个写操作成为一个小批次操作接着缓存收集写操作一起批量写入。
异步写操作极大地降低了请求延迟并减轻了数据库的负担。同时也放大了数据不一致的。比如有人此时直接从数据库中查询数据但是更新的数据还未被写入数据库此时查询到的数据就不是新的数据。
小结
不同的缓存模式有不同的考量点和特征根据应用程序需求场景的不同需要灵活的选择适配的缓存模式。在实践的过程中往往也是多种模式相结合来使用。