java:缓存数据库表,刷新1小时

时间:2018-03-15 21:00:57

标签: java guava

我需要一些针对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>

谢谢!

1 个答案:

答案 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
 }