我正在努力让Guava缓存为我的应用程序工作。具体来说,我基本上都在寻找一个行为类似地图的缓存:
// Here the keys are the User.getId() and the values are the respective User.
Map<Long, User> userCache = new HashMap<Long, User>();
来自各种在线资源(文档,博客,文章等):
// My POJO.
public class User {
Long id;
String name;
// Lots of other properties.
}
public class UserCache {
LoadingCache _cache;
UserCacheLoader loader;
UserCacheRemovalListener listener;
UserCache() {
super();
this._cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterAccess(30, TimeUnit.SECONDS)
.removalListener(listener)
.build(loader);
}
User load(Long id) {
_cache.get(id);
}
}
class UserCacheLoader extends CacheLoader {
@Override
public Object load(Object key) throws Exception {
// ???
return null;
}
}
class UserCacheRemovalListener implements RemovalListener<String, String>{
@Override
public void onRemoval(RemovalNotification<String, String> notification) {
System.out.println("User with ID of " + notification.getKey() + " was removed from the cache.");
}
}
但我不确定如何/在何处指定密钥应为Long
类型,缓存值应为User
个实例。我还希望实现store(User)
(基本上是Map#put(K,V)
)方法以及返回缓存中所有getKeys()
键的Long
方法。关于我出错的地方有任何想法吗?
答案 0 :(得分:1)
使用泛型:
class UserCacheLoader extends CacheLoader<Long, User> {
@Override
public User load(Long key) throws Exception {
// ???
}
}
store(User)
可以与Cache.put
一起实施,就像您期望的那样。
getKeys()
可以使用cache.asMap().keySet()
实现。
答案 1 :(得分:0)
你可以(而且应该!)不仅要将CacheLoader的重写加载方法的返回类型指定为User,还要将onRemoval方法参数指定为:
class UserCacheRemovalListener implements RemovalListener<String, String>{
@Override
public void onRemoval(RemovalNotification<Long, User> notification) {
// ...
}
}