本地缓存组件Caffeine,与guava、map、ehcache对比

时间:2024-06-01 09:55:57

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个线程同时从配置了最大大小的缓存中读取。

本地缓存组件Caffeine,与guava、map、ehcache对比

写操作

在这个基准测试中,8个线程同时写入一个配置了最大大小的缓存。

本地缓存组件Caffeine,与guava、map、ehcache对比

 

服务器

这些基准测试在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