2016-06-08 68 views
8

我已经通过javax.cache.Cache了解它的用法和行为。据说,何时使用Java缓存以及它与HashMap的区别?

JCache是​​一个类似地图的数据结构,它提供了 应用程序数据的临时存储。

JCache和HashMap将元素存储在本地堆内存中,默认情况下没有持久性行为。通过实施自定义CacheLoaderCacheWriter我们可以实现持久性。除此之外,何时使用它?

+0

感谢您的好问题。这应该在缓存类本身中得到解答。希望下一个版本能够:https://github.com/jsr107/jsr107spec/issues/365 – cruftex

+0

有谁知道为什么没有提供'CacheLoader'和'CacheWriter'的默认实现(磁盘持久化)? 使用MapDB/RocksDB的自定义实现会导致第三方依赖性,并且可能会出错。 –

回答

1

以下是两个对象之间的五个主要区别。

与java.util.Map,缓存:

  • 不允许null键或值。尝试使用null将导致java.lang.NullPointerException异常
  • 提供了在请求的 值不在缓存中时从javax.cache.integration.CacheLoader(通过读取缓存)读取值的能力
  • 提供将值写入到一个javax.cache.integration.CacheWriter(写式高速缓存)在创建值 时/更新/从缓存
  • 提供观察高速缓存条目的能力除去能力的变化
  • 可能捕获并测量运营统计

Source : GrepCode.com

+1

在地图上允许空键或值取决于实现类。即HashMap允许空键和值,而Hashtable不允许空键或值。 –

+0

@DavidSN当然,谢谢你的细节。 –

5

缓存通常比一张地图,这不是别的,而是或多或少的简单的数据结构更多的管理逻辑。

一些概念,JCaches可以实现

  • 到期:条目可能过期,并在一定的时间段后或自上次使用从缓存中得到去除
  • 驱逐:元素,会从如果空间缓存中删除是有限的。可以有不同的驱逐策略。 LRU,FIFO,...
  • 分布:即在一个集群中,而地图是本地的JVM
  • 持久性:在高速缓存组件可以重启后持续性及目前,地图的内容会丢失
  • 更多内存:使用名为BigMemory的技术,高速缓存实现可能会使用比JVM堆提供的更多内存,其中对象将被序列化为单独分配的字节缓冲区。这JVM的外部存储器是由OS(分页)管理,而不是JVM
  • 选项保存密钥和值或者通过值或引用(在地图上你来处理这个自己)
  • 选择应用安全

其中一些是JCache更一般的概念,一些是缓存提供商的具体实现细节

相关问题