PS: Github Caffeine
介绍
Caffeine是一个基于Java8的高性能缓存库,提供了近乎最佳的命中率。
缓存与ConcurrentMap相似,但不完全相同。最根本的区别是ConcurrentMap将所有添加到其中的元素持久化,直到它们被显式删除。另一方面,缓存通常配置为自动逐出条目,以限制其内存占用。在某些情况下,如果缓存无法自动加载或逐出缓存项,则缓存加载会很有用。
Caffeine具有灵活的结构,可结合以下特点创建缓存:
- 自动将条目加载到缓存中,可以选择异步
- 基于频率和最近性超过最大值时基于大小的逐出
- 基于时间的条目过期时间,从上次访问或上次写入开始计算
- 当对条目的第一个过时请求发生时异步刷新
- **自动包装在弱引用中
- 值自动包装在弱引用或软引用中
- 收回(或以其他方式删除)条目的通知
- 传播到外部资源的写入
- 缓存访问统计信息的累积
为了提高集成度,扩展模块中提供了JSR-107 jcache和Guava适配器。JSR-107标准化了一个基于java6的API,以牺牲特性和性能为代价最小化特定于供应商的代码。Guava的缓存是前置库,适配器提供了一个简单的迁移策略。
压测对比
运行环境:MacBook Pro i7-4870HQ CPU @ 2.50GHz (4 core) 16 GB
读操作
在这个基准测试中,8个线程同时从配置了最大大小的缓存中读取。
写操作
在这个基准测试中,8个线程同时写入一个配置了最大大小的缓存。
服务器
这些基准测试在Azure G4实例上运行,这是主要云提供商免费试用期间提供的最大实例。这台机器是一个单插槽[email protected](16核,超线程禁用),224GB,Ubuntu15.04。
读
Unbounded | ops/s (8 threads) | ops/s (16 threads) |
---|---|---|
ConcurrentHashMap (v8) | 560,367,163 | 1,171,389,095 |
ConcurrentHashMap (v7) | 301,331,240 | 542,304,172 |
Bounded | ||
Caffeine | 181,703,298 | 382,355,194 |
ConcurrentLinkedHashMap | 154,771,582 | 313,892,223 |
LinkedHashMap_Lru | 9,209,065 | 13,598,576 |
Guava (default) | 12,434,655 | 10,647,238 |
Guava (64) | 24,533,922 | 43,101,468 |
Ehcache2_Lru | 11,252,172 | 20,750,543 |
Ehcache3_Lru | 11,415,248 | 17,611,169 |
Infinispan_Old_Lru | 29,073,439 | 49,719,833 |
Infinispan_New_Lru | 4,888,027 | 4,749,506 |
写
Unbounded | ops/s (8 threads) | ops/s (16 threads) |
---|---|---|
ConcurrentHashMap (v8) | 60,477,550 | 50,591,346 |
ConcurrentHashMap (v7) | 46,204,091 | 36,659,485 |
Bounded | ||
Caffeine | 55,281,751 | 48,295,360 |
ConcurrentLinkedHashMap | 23,819,597 | 39,797,969 |
LinkedHashMap_Lru | 10,179,891 | 10,859,549 |
Guava (default) | 4,764,056 | 5,446,282 |
Guava (64) | 8,128,024 | 7,483,986 |
Ehcache2_Lru | 4,205,936 | 4,697,745 |
Ehcache3_Lru | 10,051,020 | 13,939,317 |
Infinispan_Old_Lru | 7,538,859 | 7,332,973 |
Infinispan_New_Lru | 4,797,502 | 5,086,305 |