更新缓存的最佳方式:Google Guava

时间:2013-09-03 13:11:13

标签: java caching thread-safety guava

这就是我正在做的事情

Cache<String,MYClass> cache=CacheBuilder.newBuilder().
                maximumSize(100).
                expireAfterAccess(30, TimeUnit.MINUTES).
                build();

String id="myid";
MyClass obj=cache.getIfPresent(id);
System.out.println(obj.getMyVariable);
obj.setMyVariable("myNewString");
updateCache(id,obj);
myClass obj2=cache.getIfPresent(id);
System.out.println(obj2.getMyVariable);

缓存是否更新了MyClass对象?我猜不是。 如果没有,哪种方式更好?

void update(String id,MyClass obj){
    cache.put(id,obj);
}

void update(String id,Myclass obj){
     cache.invalidate(id);
     cache.put(id,obj);
}

期望输出:

myOldString
myNewString

1 个答案:

答案 0 :(得分:4)

Guava的Cache 不会复制放入其中的对象。如果您正在修改从缓存中获取的对象,则需要为每个人修改 (并且不需要为此更新缓存,因为它引用了相同的实例)。

最好缓存不可变的对象,或者至少正确支持并发修改(这通常不意味着它的访问者只是synchronized,所以说起来容易做起来难。)