Java缓存
缓存
1.基本思想
- 避免用户在请求数据的时候获取速度过于缓慢,所以我们在数据库之上增加了缓存这一层来弥补。
2.本地缓存解决方案
- 常见的有Ehcache、guavaCache、Caffeine Cache等,性能最优的为Caffeine cache。
常见的单体架构使用 Nginx 来做负载均衡,部署两个相同的服务到服务器,两个服务使用同一个数据库,并且使用的是本地缓存。
3.为什么要用分布式缓存?而不用本地缓存?
本地缓存存在局限性:
- 本地缓存对分布式架构支持不友好,比如同一个相同的服务部署在多台机器上的时候,各个服务之间的缓存是无法共享的,因为本地缓存只在当前机器上有。
- 本地缓存容量受服务部署所在的机器限制明显。 如果当前系统服务所耗费的内存多,那么本地缓存可用的容量就很少。
4.缓存读写模式/更新策略/处理流程
- Cache Aside Pattern(旁路缓存模式)
- 读:从 cache 中读取数据,读取到就直接返回 。读取不到的话,先从 DB 加载,写入到 cache 后返回响应。
- 写:更新 DB,然后直接删除 cache 。
- Read/Write Through Pattern(读写穿透)
- 读:从 cache 中读取数据,读取到就直接返回 。读取不到的话,先从 DB 加载,写入到 cache 后返回响应。
- 写:先查 cache,cache 中不存在,直接更新 DB。 cache 中存在,则先更新 cache,然后 cache 服务自己更新 DB(同步更新 cache 和 DB)。
- Write Behind Pattern(异步缓存写入)
- 读:从 cache 中读取数据,读取到就直接返回 。读取不到的话,先从 DB 加载,写入到 cache 后返回响应。
- 写:无论是否存在,都直接跟新缓存,最好异步批量的方式来更新 DB。