java – 当我计划有效地缓存多个值时,我应该如何实现Guava缓存?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 当我计划有效地缓存多个值时,我应该如何实现Guava缓存?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2236字,纯文字阅读大概需要4分钟。
内容图文
![java – 当我计划有效地缓存多个值时,我应该如何实现Guava缓存?](/upload/InfoBanner/zyjiaocheng/809/7b0c57d7fd024682980350ec63713bad.jpg)
我有一个Java类,它有一个Guava LoadingCache< String,Integer>在那个缓存中,我打算存储两件事:活跃员工当天工作的平均时间和效率.我正在缓存这些值,因为每次请求进入时计算都会很昂贵.而且,每分钟都会刷新缓存的内容(refreshAfterWrite).
我想在这种情况下使用CacheLoader,但是,它的加载方法只为每个键加载一个值.在我的CacheLoader中,我打算做以下事情:
private Service service = new Service();
public Integer load(String key) throws Exception {
if (key.equals("employeeAvg"))
return calculateEmployeeAvg(service.getAllEmployees());
if (key.equals("employeeEff"))
return calculateEmployeeEff(service.getAllEmployees());
return -1;
}
对我来说,我发现这非常低效,因为为了加载这两个值,我必须两次调用service.getAllEmployees()因为,如果我错了,请纠正我,CacheLoader应该是无状态的.
这使我想到使用LoadingCache.put(key,value)方法,所以我可以创建一个实用程序方法,调用service.getAllEmployees()一次并动态计算值.但是,如果我使用LoadingCache.put(),我将没有refreshAfterWrite功能,因为它依赖于缓存加载器.
如何提高效率?
解决方法:
看起来您的问题源于使用字符串来表示值类型(Effective Java Item 50).相反,请考虑定义存储此数据的正确值类型,并使用memoizing Supplier来避免重新计算它们.
public static class EmployeeStatistics {
private final int average;
private final int efficiency;
// constructor, getters and setters
}
Supplier<EmployeeStatistics> statistics = Suppliers.memoize(
new Supplier<EmployeeStatistics>() {
@Override
public EmployeeStatistics get() {
List<Employee> employees = new Service().getAllEmployees();
return new EmployeeStatistics(
calculateEmployeeAvg(employees),
calculateEmployeeEff(employees));
}});
您甚至可以在EmployeeStatistics中移动这些计算方法,只需将所有员工传递给构造函数,然后让它计算相应的数据.
如果您需要配置超过Suppliers.memoize()或Suppliers.memoizeWithExpiration()可以提供的缓存行为,请考虑这种类似的模式,这隐藏了您在供应商中使用缓存的事实:
Supplier<EmployeeStatistics> statistics = new Supplier<EmployeeStatistics>() {
private final Object key = new Object();
private final LoadingCache<Object, EmployeeStatistics> cache =
CacheBuilder.newBuilder()
// configure your builder
.build(
new CacheLoader<Object, EmployeeStatistics>() {
public EmployeeStatistics load(Object key) {
// same behavior as the Supplier above
}});
@Override
public EmployeeStatistics get() {
return cache.get(key);
}};
内容总结
以上是互联网集市为您收集整理的java – 当我计划有效地缓存多个值时,我应该如何实现Guava缓存?全部内容,希望文章能够帮你解决java – 当我计划有效地缓存多个值时,我应该如何实现Guava缓存?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。