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

Nor*_*mal 5 java guava

我需要一些用于Java的缓存解决方案。我需要存储1小时逐出的1 db表的内容,然后清除所有值并再次填充表中的数据。

我一直在研究番石榴缓存,但似乎它未在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)
Run Code Online (Sandbox Code Playgroud)

可能与重复。但是它看起来很旧,并且不包含所需的解决方案。

另外,我有一个不同的用例,在某些用例中,应从Web服务器或文件系统上的文件中检索数据,因此我不想依赖任何数据库特定的方法作为休眠缓存或某种类型的东西。

谢谢!

hov*_*yan 4

您是否看过带有记忆功能的 Guava 供应商?支持供应商记忆与驱逐。你可以用它来构建这样的东西:

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
 }
Run Code Online (Sandbox Code Playgroud)