java:缓存数据库 table,刷新 1 小时
java: cache database table with 1 hour refresh
我需要一些 java 的缓存解决方案。我需要用 1 小时驱逐存储 1 db table 的内容,然后清除所有值并再次从 table 填充数据。
我正在研究番石榴缓存,但它似乎没有在 CacheLoader 中提供必需的 api。方法 CacheLoader.load 只填充 1 个值(所以我想同时填充所有值)并且 CacheLoader.loadAll 应该被触发getAll 在我的情况下应该避免的调用。
这是我想要的伪代码:
Cache<String, String> cache = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.HOURS)
.build(new CacheLoader<String, String> {
public Map<String, String> loadAll() {
// some logic for retrieving data from db
}
})
...
String value = cache.get(key)
可能与 this 重复。但它看起来很旧并且不包含所需的解决方案。
我还有一个不同的用例,在其中一些用例中,数据应该从网络服务器或文件系统上的文件中检索,所以我不想依赖任何特定于数据库的方法,如休眠缓存或类似的东西.
谢谢!
你看过Guava's Suppliers with memoization了吗?
支持带驱逐的供应商记忆。
你可以用它来构建这样的东西:
public class DatabaseDataProvider {
private final Supplier<Map<String, String>> dbDataSupplier;
public DatabaseDataProvider(long duration) {
final Supplier<Map<String, String>> supplier = () -> loadDbData();
if (duration <= 0) {
this.dbDataSupplier = supplier; //no caching
} else {
this.dbDataSupplier =
Suppliers.memoizeWithExpiration(supplier, duration, TimeUnit.SECONDS);
}
}
public Map<String, String> getAllDbData() {
return dbDataSupplier.get();
}
private Map<String, String> loadDbData() {
//DB magick
}
我需要一些 java 的缓存解决方案。我需要用 1 小时驱逐存储 1 db table 的内容,然后清除所有值并再次从 table 填充数据。
我正在研究番石榴缓存,但它似乎没有在 CacheLoader 中提供必需的 api。方法 CacheLoader.load 只填充 1 个值(所以我想同时填充所有值)并且 CacheLoader.loadAll 应该被触发getAll 在我的情况下应该避免的调用。
这是我想要的伪代码:
Cache<String, String> cache = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.HOURS)
.build(new CacheLoader<String, String> {
public Map<String, String> loadAll() {
// some logic for retrieving data from db
}
})
...
String value = cache.get(key)
可能与 this 重复。但它看起来很旧并且不包含所需的解决方案。
我还有一个不同的用例,在其中一些用例中,数据应该从网络服务器或文件系统上的文件中检索,所以我不想依赖任何特定于数据库的方法,如休眠缓存或类似的东西.
谢谢!
你看过Guava's Suppliers with memoization了吗? 支持带驱逐的供应商记忆。 你可以用它来构建这样的东西:
public class DatabaseDataProvider {
private final Supplier<Map<String, String>> dbDataSupplier;
public DatabaseDataProvider(long duration) {
final Supplier<Map<String, String>> supplier = () -> loadDbData();
if (duration <= 0) {
this.dbDataSupplier = supplier; //no caching
} else {
this.dbDataSupplier =
Suppliers.memoizeWithExpiration(supplier, duration, TimeUnit.SECONDS);
}
}
public Map<String, String> getAllDbData() {
return dbDataSupplier.get();
}
private Map<String, String> loadDbData() {
//DB magick
}