MemoryStore、Off-Heap Store、DiskStore

MemoryStore

始终处于启用状态,所有元素都可以放在MemoryStore层

  • 线程安全
  • 就是使用内存存储(ConcurrentHashMap),很快
    所有的cache都指明了最大占用内存,超过了
  • 如果不允许溢出内存,存在的元素被删除
  • 允许溢出,检查执行,删除过期元素,没过期的移到下一层。过期策略有LRU(最近最少使用)、LFU(最近使用频率最少)、FIFO(先进先出)
    getQuiet、putQuiet 操作元素时不会更新最近使用时间和使用次数,使用次数的统计使用AtomicLongFieldUpdater的cas操作更新

Off-Heap Store

也称之为BigMemory,不受GC影响,可以存放超大的cache,off-heap的数据是以字节存储的,所以元素key和value都必须序列化,get和put操作时都伴随着序列化和反序列化的过程。MemoryStore保存了来自Off-Heap Store使用最频繁的数据。

DiskStore

可以当做额外的空间,系统重启可以持久化缓存数据到磁盘
必须是序列化的元素才能放到DiskStore,DiskStore也是线程安全的
DiskStore的俩种策略

  • localTempSwap 在操作期间允许cache溢出到磁盘,但是系统重启后会清除这类cache,可以使用maxEntriesLocalDisk or maxBytesLocalDisk来控制可以存放在磁盘的cache大小
  • localRestartable 这个策略实现了一个restartable store,它保存了内存中所有的cache,重启后,数据还是会被加载进入restartable store。

Expiry and Eviction

ehcache默认一个线程用来移除过期元素,diskExpiryThreadIntervalSeconds属性设置过期线程跑的间隔时间,默认120s。

MemoryStore比DiskStore快一个数量级,因为DiskStore需要序列化数据、删除过期数据、读取数据。写数据是由一个单独的线程异步写到磁盘。
建议:尽可能使用MemoryStore,当MemoryStore存不下时使用Off-Heap Store,这不会引起GC。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 10,790评论 0 9
  • 理论总结 它要解决什么样的问题? 数据的访问、存取、计算太慢、太不稳定、太消耗资源,同时,这样的操作存在重复性。因...
    jiangmo阅读 8,046评论 0 11
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 9,870评论 1 14
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,794评论 1 32
  • 一、简介 Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内...
    小程故事多阅读 44,339评论 9 59