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

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

堆内缓存:

  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()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值