1、缓存回顾:
使用场景:互联网,数据越来越多,用户越来越多,并发量、吞吐量越来越大
- 使用数据库存储,分库分表,也不能满足要求,使用缓存,减轻数据库的压力
- 临时存储的数据
- 其他的场景:Session分离、分布式锁
缓存:服务器端
本地缓存(local cache):CurrentHashMap、Ehcache、Guava Cache
缓存在应用服务器,全局变量,JVM缓存
- 优势:和应用程序在同一进程,访问快,没有网络开销,一般不会崩
- 缺点:容量小,每个JVM有一份,有数据冗余
分布式缓存:Redis、Memcached、Tair(阿里、美团)、EVCache(AWS)、Aerospike
- 优势:空间优势、在应用中共享(session共享)、高可用(主从)、高扩展(分区)、集群
- 缺点:资源、网络开销、数据一致性(AP)
GuavaCache、Tair、EVCache、Aerospike比较
GuavaCache | Tair | EVCache | Aerospike | |
类别 | 本地缓存(JVM缓存) | 分布式缓存 | 分布式缓存 | 分布式NoSQL数据库 |
应用 | 高并发本地缓存 | 阿里、美团 | Netflix、AWS | 互联网广告行业(国外) |
性能 | 高 | 较高 | 很高 | 较高 |
持久化 | 无 | 有 | 有 | 有 |
集群 | 无 | 有 | 有 | 有 |
2、Guava Cache介绍
2.1、JVM缓存
JVM 缓存,是堆缓存。其实就是创建一些全局容器,比如List、Set、Map等。这些容器用来做数据存储。
这样做的问题:
- 不能按照一定的规则淘汰数据,如 LRU,LFU,FIFO 等。
- 清除数据时的回调通知,并发处理能力差,针对并发可以使用CurrentHashMap,但缓存的其他功能需要自行实现
- 缓存过期处理,缓存数据加载刷新等都需要手工实现
2.2、Guava Cache
- Guava是Google提供的一套Java工具包,而Guava Cache是一套非常完善的本地缓存机制(JVM缓存)。
- Guava cache的设计来源于CurrentHashMap,可以按照多种策略来清理存储在其中的缓存值且保持很高的并发读写性能。
3、Guava Cache应用场景
本地缓存的应用场景:
- 对性能有非常高的要求
- 不经常变化
- 占用内存不大
- 有访问整个集合的需求
- 数据允许不时时一致
guava cache:高并发,不需要持久化
currentHashMap:高并发
Ehcached:持久化 二级缓存
Guava Cache 的优势:
- 缓存过期和淘汰机制
在GuavaCache中可以设置Key的过期时间,包括访问过期和创建过期,GuavaCache在缓存容量达到指定大小时,采用LRU的方式,将不常使用的键值从Cache中删除
- 并发处理能力
- GuavaCache类似CurrentHashMap,是线程安全的。
- 提供了设置并发级别的api,使得缓存支持并发的写入和读取
- 采用分离锁机制,分离锁能够减小锁力度,提升并发能力
- 分离锁是分拆锁定,把一个集合看分成若干partition, 每个partiton一把锁。ConcurrentHashMap就是分了16个区域,这16个区域之间是可以并发的。GuavaCache采用Segment做分区。
- 更新锁定
- 一般情况下,在缓存中查询某个key,如果不存在,则查源数据,并回填缓存。(Cache Aside Pattern)
- 在高并发下会出现,多次查源并重复回填缓存,可能会造成源的宕机(DB),性能下降
- GuavaCache可以在CacheLoader的load方法中加以控制,对同一个key,只让一个请求去读源并回填缓存,其他请求阻塞等待。
- 集成数据源
- 一般我们在业务中操作缓存,都会操作缓存和数据源两部分
- 而GuavaCache的get可以集成数据源,在从缓存中读取不到时可以从数据源中读取数据并回填缓存
- 监控缓存加载/命中情况
统计