《全栈工程师修炼指南》学习笔记 16
2023-02-18 本文已影响0人
VioletJack
持久层 - 缓存
缓存的本质
缓存,就是为了节约对原始资源重复获取的开销,而将结果数据副本存放起来以供获取的方式。
缓存生效的本质是空间换时间。
只有当一个操作是幂等的、安全的,这样的操作才可以考虑被缓存。
当一个数据是幂等的,安全的,但不会被重复获取,那么这类数据不需要使用缓存。
缓存可以是为了提高获取资源的速度,也可以是为资源的获取分担压力。
缓存的几个特点
缓存往往针对的是资源
缓存数据必须是重复获取的。
缓存是为了解决开销问题。
缓存的存取不一定是更快的。
缓存的各种读写模式是可以组合使用的。
选择哪种缓存模式算是一种 trade-off,根据实际情况来决定。
缓存的两个动机
追求更低的延迟。
追求更高的吞吐量
缓存需要注意的点
同时发送多个请求,如何保证一致性?
如果数据更新异常,会不会出现缓存问题?
缓存无处不在
DNS 缓存
反向代理缓存
后端 MVC 各级缓存
网络请求缓存 Cache-control
CDN
……
缓存应用模式
Cache-Aside
应用查询缓存是否有数据结果。(判断选择行为)
如果有,从缓存返回数据结果。
如果没有,执行原始逻辑,返回数据结果、
将数据结果写入缓存。
Read-Through
应用向缓存要求数据。(直接问缓存要)
如果缓存中有数据,返回给应用。
如果缓存中没有数据,缓存查询数据库,并将结果写入自己。
缓存将数据返回给应用。
Write-Through
这种模式一般用于处理数据更新的场景。
缓存系统需要自己内部保证并发场景下,缓存更新的顺序要和数据库更新的顺序一致。
步骤
- 应用要求缓存更新数据
- 如果缓存中有数据,先更新该数据。
- 缓存再更新数据库中的数据。
- 缓存告知应用更新完成。
Write-Around
类似 Write Through 模式,但是它只更新数据库,而缓存只提供读的操作。
Write-Back
高吞吐量、高运行速度,但容易出现一致性和数据丢失的问题。
应用要求缓存更新数据
缓存就数据写入自己
缓存告知应用更新完成
缓存异步更新数据库
缓存数据更新策略
先更新数据库
再令缓存失效