用于自定义POJO的番石榴缓存

时间:2014-11-21 15:46:43

标签: java caching guava

我正在努力让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方法。关于我出错的地方有任何想法吗?

2 个答案:

答案 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) {
   // ...
}

}