Java缓存库对比-以及OHCache总结

本文对比了Java缓存库,包括LinkedHashMap、Guava Cache、Ehcache、Caffeine和堆外缓存如OHCache、ChronicleMap、MapDB。在大数据量场景下,OHCache被选择用于缓解Full GC压力。OHCache提供LRU、W_TINY_LFU等驱逐策略,支持自定义序列化,并具有过期机制,但过期检查在get或put时进行。建议配合jemalloc使用以减少内存碎片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆内缓存:

  1. LinkedHashMap:Java自带类,内置LRU驱逐策略的实现(access-order);多线程访问需要自己实现同步。
  2. Guava Cache:Google Guava工具包中的缓存实现,支持LRU驱逐策略;支持多线程并发访问,支持按时间过期,但只有在访问时才清除过期数据。
  3. Ehcache:支持多种驱逐策略:LFU、LRU、FIFO,支持持久化和集群。性能跟Guava Cache比相当。
  4. Caffeine:支持W-TinyLFU驱逐策略,Benchmark测试读写性能是Guava Cache的6倍左右。

堆外缓存:

  1. OHCache:支持缓存驱逐和过期(Cassandra使用的缓存库)
  2. ChronicleMap:支持Hash结构,性能好,不支持缓存驱逐
  3. MapDB:支持Tree结构,可顺序扫描,不支持缓存驱逐
  4. Ehcache3:BigMemory收费

当缓存数据量非常大时,GC压力过大会导致服务响应慢甚至崩溃,在HugeGraph图数据库中为了缓解该问题,需引入堆外缓存,选择了使用OHCache。

OHCache对外缓存总结

开源:https://github.com/snazy/ohc

特性:

  • 底层有2种实现:linked实现,适用于中大entry场景,默认实现,大部分feature只在该实现中才支持;chunked实现,适用于小entry场景,通过设置chunkSize或者fixedEntrySize启用。
  • 通过eviction()来设置缓存驱逐策略,支持:LRU, W_TINY_LFU, NONE共3种,后两种仅在linked实现中支持。
  • 通过capacity()来指定缓存的容量,单位是字节,注意不是条数。
  • 通过hashTableSize()来设置每个hash_table最大存放的entry个数数量(默认是0.75的factor)。
  • 必须指定自定义的keySerializer、valueSerializer系列化器,重载实现系列化serialize()方法与反序列化deserialize()方法;需要注意的是还需要重载serializedSize()方法,且该方法返回值必须和实际写入的内容大小完全一样,否则会报错或数据不对。
  • 支持缓存条目过期机制,通过timeouts()开启;允许通过defaultTTLmillis()设置一个默认过期时间,也可以在put()的时候单独设置expireAt过期时间。注意:过期机制仅linked实现才支持,因为chunked实现是以chunk为单位进行缓存驱逐的,无法精确到entry粒度;而且并没有独立的线程来回收过期条目,只会在get或put操作时进行检查(见get()或者ensureFreeSpaceFo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值