【问题标题】:Timed caching in VertxVertx 中的定时缓存
【发布时间】:2020-05-20 10:13:22
【问题描述】:

我刚开始使用 Vertx。我想知道是否有办法在一段时间内存储/缓存响应数据?

例如,用户第一次调用我的API,它会查询服务器上的数据库并返回一个数据。我想将此数据保存/缓存到服务器上的本地文件(或内存)中,例如 3 小时。在这 3 个小时内,如果任何其他用户再次调用 API,它将使用缓存的数据。 3小时后,缓存数据重置。

我尝试在 Google 上搜索诸如 Vertx Redis 或 StaticHandler 之类的解决方案,但它们似乎过于复杂,而且似乎不符合我的需求?

有没有简单的方法来实现这一点?

【问题讨论】:

  • 我认为最简单的方法是将数据存储在 Map 并使用 Vert.x setTimer 驱逐缓存。
  • 感谢您的建议!我如何实现这一目标? setTimer 属于哪个类?

标签: java caching vert.x


【解决方案1】:

您可以使用缓存(可能有一些 Map)和 Vertx::setTimer 在 3 小时后使其无效。假设您使用的是Router

 router.get("/things/:id").handler(rc -> {
     String id = rc.pathParam("id");
     List result = cache.getThing(id);
     if (result == null) {
       result = getThingFromDatabase(id);
       cache.saveThing(result);
       vertx.setTimer(10800000, t -> { // <-- 3 hours
           cache.invalidateThing(id);
       });
     }
     return result;
 });

【讨论】:

  • 谢谢!我最终改用AsyncMap,但这对我也有用(并且给了我一个前进的方向)!
  • 乐于助人:)
【解决方案2】:

您不必再次为 Vert.x 重新发明轮子。有很多工具可以为您进行缓存,Google Guava cache 应该非常适合您的需求。

在您的 Verticle 中,您定义一个 cache 并通过它访问您的数据库。缓存完成其余的工作:

LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder()
       .expireAfterWrite(3, TimeUnit.HOURS)
       .build(
           new CacheLoader<Key, SomeClass>() {
             @Override
             public SomeClass load(Key key) throws AnyException {
               return loadYourData(key);
             }
           });

然后每当您需要获取数据时:

SomeClass obj = cache.get(key);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 2021-12-20
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多