我使用cache2k作为我的java应用程序的缓存。
如果缓存不在in-mermoy缓存中,我会使用CacheSource来获取和查看请求。 但现在我想实现 put 方法。
希望有人可以帮助我。
private static Cache<String, Integer> c =
CacheBuilder.newCache(String.class, Integer.class)
.source(new CacheSource<String, Integer>() {
public Integer get(String o) {
System.out.println("ACCESSING SOURCE");
return checkCache(o) ? 1: 0; // checkCache checks if the item is in MySQL Cache
}
})
.name("cache")
.build();
答案 0 :(得分:2)
对于第一个问题,您需要添加两行:
private static Cache<String, Integer> c =
CacheBuilder.newCache(String.class, Integer.class)
.name("cache")
.maxSize(1000) // limits in memory cache to 1000 entries
.expirySecs(60) // sets expiry (time to live) to 60 seconds
.source(new CacheSource<String, Integer>() {
public Integer get(String o) {
System.out.println("ACCESSING SOURCE");
return checkCache(o) ? 1: 0;
}
})
.build();
expirySecs上的两个提示:默认情况下,cache2k的默认有效期为10分钟。您可以使用expirySecs(-1)
关闭到期日期。即将推出的cache2k版本0.20将清除界面:eternal(true)
将关闭到期时间。 expiryDuration(long, Timeunit)
是设置到期时间的新方法。方法expiryMillis
和expirySecs
仍然存在并受支持,但会在以后的版本中消失。
第二个问题:要使用附加的mysql持久性将条目放入缓存中,请使用以下模式:
start database transaction
update item in the database
cache.remove(item key)
commit the transaction
通过get()
进行的下一次缓存访问将是未命中,调用缓存源并从数据库中获取更新的元素。如果在get()
和数据库提交之间发生remove()
,它将停止,直到提交事务(这实际上取决于您的mysql设置和事务隔离级别)。如果要将cache2k用作数据库持久层的缓存,则此模式也有效。
使用cache.put
然后将元素插入数据库会导致并发问题,因为这两个操作不是原子的。上面的模式更安全,但速度更慢,因为每次缓存更新都需要数据库存储和提取。
另一个提示:&#34;最佳方式&#34;这样做将在未来发生变化。我现在正在为cache2k添加一般持久性支持。因此,将来只需添加数据库属性即可。