我需要一些针对java的缓存解决方案。我需要存储1分贝表的内容,一小时驱逐,然后清除所有值并再次从表中填充数据。
我正在研究番石榴缓存,但它似乎没有在 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可能重复。但它看起来很旧,并没有包含所需的解决方案。
此外,我有一个不同的用例,其中一些数据应该从Web服务器或文件系统上检索,所以我不想依赖任何特定于数据库的方法作为hibernate缓存或类似的东西。< / p>
谢谢!
答案 0 :(得分:3)
你看过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
}