Using the Cache API_CN(Cache API的使用)

Cache 接口

Infinispan 对外发布了一个兼容 JSR-107Cache 接口。

http://community.jboss.org/servlet/JiveServlet/showImage/2133/cache_api.png

Cache接口对外提供了添加、获取和删除数据项的简单方法,包括JDK's ConcurrentMap接口提供的原子机制。根据所使用的缓存模式,调用这些方法将会导致大量现象产生,有可能会将一个数据项复制到远程节点或者从一个远程节点获取某个数据项,也有可能是快速存储。

注意: 对于简单的使用来说,使用Cache API和使用JDK Map API没有什么区别,因此从基于Map的简单内存缓存迁移到基于Infinispan的缓存是十分容易的。

某些Map 方法的限制

当使用Infinispan时,Map提供的一些方法有一定的限制,例如 size(), values(), keySet()entrySet()。特别之处在于,这些方法是不可靠的并且只能。不论是本地还是全局模式,这些方法都不会要求锁,并且也不会考虑到并发修改,添加和删除。更进一步来说,他们的操作只是针对本地数据容器,不会为你提供一个全局的状态视图。

 

如果尝试在全局环境下使用这些操作时,将会对性能产生巨大的影响并最终成为一个扩展性瓶颈。因此,这些方法只能出于调试或者输出信息的目的使用。 

临时和永久数据

为了更加简单的存储数据,Infinispan的cache API允许你对数据项附带生命期的信息。例如,简单调用put(key, value) 方法将会创建一个永久的数据项,也就是说,一个数据项将会永远存储在缓存中直到它被移除(或者为了防止内存溢出而使其在内存中失效)。 然而,如果你调用 put(key, value, lifespan, timeunit)来向内存中存储一个数据,将会创建一个临时的数据项,也就是说这个数据项会有一个固定的有效期,并且会在超过有效期后自动过期。

 

除了有效期(lifespan),Infinispan 还支持其他的一个决定过期的语义项,maxIdle。 多个 lifespan 和maxIdle 能够搭配使用。

临时数据和过期范例

通过Infinispan使用临时数据的例子请参照此页面页面

AdvancedCache 接口

除了简单的 Cache 接口, Infinispan还提供了一个  AdvancedCache 接口。  通过AdvancedCache能够注入自定义拦截器,访问内部组件以及应用flags来改变某些cache方法的默认行为.。下面的代码描述了如何获取一个AdvancedCache:

AdvancedCache advancedCache = cache.getAdvancedCache();

Flags

Flags应用于常规的缓存方法来改变某些方法的默认行为。对于flags的列表和他们的影响可以参照 Flag说明。Flags通过调用AdvancedCache.withFlags()发挥作用。通过下面的方法可以应用到个flags到一次缓存调用, 例如:

 

advancedCache.withFlags(Flag.CACHE_MODE_LOCAL, Flag.SKIP_LOCKING)
   .withFlags(Flag.FORCE_SYNCHRONOUS)
   .put("hello", "world");

自定义拦截器

AdvancedCache接口为高级开发者提供了一种机制,通过这种机制使得开发者能够绑定自定义的拦截器。 自定义拦截器使开发者能够改变cache API方法的行为,并且AdvancedCache接口使得开发者能够在运行时通过编程的方法来绑定这些拦截器。更多细节请参考  AdvancedCache Javadocs。

关于如何编写自定义拦截器的信息,请参照 Infinispan自定义拦截器