【问题标题】:java: cache database table with 1 hour refreshjava:缓存数据库表,刷新 1 小时
【发布时间】:2018-03-15 21:00:57
【问题描述】:

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

this 可能重复。但它似乎很旧,并且不包含所需的解决方案。

我还有一个不同的用例,其中一些数据应该从网络服务器或文件系统上的文件中检索,所以我不想依赖任何特定于数据库的方法作为休眠缓存或类似的东西。

谢谢!

【问题讨论】:

  • Server 环境使用 JCache 更好。您可以使用 Ignite Apache 作为实现。
  • Apache Ignite 是外部数据网格,不是吗?我的意思是我想要更容易实现和部署的东西
  • 我只需要带有驱逐时间支持和到期监听器的 ConcurrentHashMap
  • JCache 可以作为本地内存缓存(类似 Guava Cache)。非常容易使用。
  • 好的,谢谢!可能我需要研究这种方法

标签: java guava memoization supplier


【解决方案1】:

你看过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
 }

【讨论】:

  • 哇,看起来正是我想要的。让我研究一下解决方案。
  • @hovanessyan 有没有办法根据数据库中的表更新来触发番石榴缓存更新?
  • @RanPaul 是的,你可以实现这样的机制,但这取决于更新来自哪里。如果更新来自您的代码库,您甚至可以在提交更新后触发并注册该事件的侦听器,这将拦截它并触发 Guava 逻辑。如果也有可能在数据库级别执行更新(例如,有人手动执行更新语句) - 与上述相同的逻辑适用 - 您需要触发事件并根据它做出反应(参见 CDC 模式)。
  • @hovanessyan 正在寻找第二种方法,当对数据库缓存执行更新时需要刷新,您能回答我的问题stackoverflow.com/questions/56466572/…
猜你喜欢
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多