缓存入门
文章目录
缓存
-
问题起因: cpu处理速度快,而读取数据库/磁盘上的数据慢,造成性能瓶颈
-
解决思路:空间换时间,把磁盘上是数据 放在速度更快的内存里读取
一般缓存都有这些功能:数据存取、过期时间、淘汰机制、命中率统计
- 缓存缺点:增加系统复杂性,开发成本往往会增加
本地缓存
java HashMap 的数据在内存中,读取速度比数据库快
把数据保存在 HashMap 或 ConcurrentHashMap 读取,就是一个本地缓存的实现了,
- 本地缓存缺点:
- 各个相同服务之间的本地缓存的数据无法共享。对分布式架构支持不友好
- 容量受服务部署所在的机器限制明显
分布式缓存
- mysql,oracle 是在磁盘的 数据库服务
- 分布式缓存(Distributed Cache) 是在内存的 数据库服务
- 分布式缓存缺点:
- 需要新增Redis 或 Memcached 等分布式缓存服务应用,要单独保证分布式缓存服务应用的高可用。
缓存读写模式/更新策略
Cache Aside Pattern(旁路缓存模式)
以 DB 的结果为准
有首次请求数据一定不在 cache 的问题,对于热点数据可以提前放入缓存中。
适合读请求比较多的场景
- 写:更新 DB,然后直接删除 cache 。
- 读:从 cache 中读取数据,
读取到:就直接返回,
读取不到:就从 DB 中取数据返回,然后再把数据放到 cache 中。
Read/Write Through Pattern(读写穿透)
由 cache 服务来负责 cache 和 DB 的读写。同步更新 cache 和 DB
减轻了应用程序的职责
- 写(Write Through):先查 cache,
cache 中不存在:直接更新 DB。
cache 中存在:先更新 cache,然后 cache 服务自己更新 DB(同步更新 cache 和 DB)。 - 读(Read Through): 从 cache 中读取数据,
读取到:就直接返回 。
读取不到:先从 DB 加载,写入到 cache 后返回响应。
Write Behind Pattern(异步缓存写入)
由 cache 服务来负责 cache 和 DB 的读写。异步更新 cache 和 DB
写性能非常高, 适合数据经常变化的业务场景(文章的点赞数量、阅读数量)
只更新缓存,不直接更新 DB,改为异步批量的方式来更新 DB。