在java中缓存方法的结果

时间:2013-06-13 13:50:56

标签: java caching

我有这种方法从数据库加载大量数据

private List<Something> loadFromDb() {
    //some loading which can take a lot of time
}

我正在寻找一种 简单 方式来缓存某些固定时间(例如2分钟)的结果。我不需要拦截方法调用本身,只是为了缓存返回的数据 - 如果需要,我可以编写另一个执行缓存的方法。

我不想:

  • 使用AOP编译时编织如this one - 它需要在构建中进行更改
  • 在Spring中使用@Cacheable - 我必须为每个可缓存方法定义缓存

是否有可以简化此任务的库,还是应该执行其他操作?这种库的示例用法是

private List<Something> loadFromDbCached() {
    //in java 8 'this::loadFromDb' would be possible instead of a String
    return SimpleCaching.cache(this, "loadFromDb", 2, MINUTES).call();
}

编辑:我正在寻找一个能够实现这一目标的库,管理缓存比看起来更麻烦,特别是如果你有并发访问权

3 个答案:

答案 0 :(得分:12)

使用Guava的Suppliers.memoizeWithExpiration(Supplier delegate, long duration, TimeUnit unit)

private final Supplier<List<Something>> cache =
    Suppliers.memoizeWithExpiration(new Supplier<List<Something>>() {
        public List<Something> get() {
            return loadFromDb();
        }
    }, 2, MINUTES);

private List<Something> loadFromDbCached() {
    return cache.get();
}

答案 1 :(得分:7)

检查Guava Cache Builder这可能有用。

答案 2 :(得分:2)

您可以使用@Cacheable中的jcabi-aspects注释:

public class Resource {
  @Cacheable(lifetime = 5, unit = TimeUnit.SECONDS)
  public String load(URL url) {
    return url.openConnection().getContent();
  }
}

load()的结果将被缓存五秒钟。查看这篇文章,它解释了详细信息:http://www.yegor256.com/2014/08/03/cacheable-java-annotation.html