微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache Geode 中密钥的自动同步

如何解决Apache Geode 中密钥的自动同步

我有一个 Apache Geode 设置,与外部 Postgres 数据源连接。我有一个场景,我定义了密钥的到期时间。假设在 T 时间之后密钥将过期。有没有办法让即将过期的键可以调用外部数据源并更新值,以防值已更改?我想要一种自动同步我在 Apache Geode 中的密钥。是否有任何接口可以实现并获得所需的行为?

解决方法

我不确定我是否完全理解您的问题。您是说缓存中的值可能比当前存储在数据库中的值更新?

无论您使用的是Look-Aside CachingInline Caching,还是Near Caching,Apache Geode 与 Spring 的结合都能满足您的需求确保缓存和数据库保持同步,在某种程度上取决于缓存模式。

使用Look-Aside Caching,如果使用得当,数据库(即主记录系统 (SOR),例如您的情况下的 Postgres)应该始终是最新的。 (Look-Aside缓存是次要的。

使用同步内联缓存(对读/写使用CacheLoader/CacheWriter组合),特别是强调CacheWriter,在更新(例如Region.put(key,value) 缓存操作)期间,首先写入数据库,然后将条目存储(或覆盖)在缓存中。如果 DB 写入失败,则不会写入或更新缓存条目。每次更新键的值时都是如此。如果键最近没有更新,那么数据库应该反映最新的值。再次强调,数据库应该始终是最新的。

使用异步内联缓存(使用 AEQ + 监听器,用于后写),缓存条目的更新排队并异步写入数据库。如果一个条目被更新,那么 Geode 可以保证该值最终被写入底层数据库,无论该键是否在某个时间到期。您可以在系统出现故障、合并事件等情况下保留和重放队列。在这种情况下,缓存和数据库最终是一致的,并且假设您知道这一点,这对于您的应用程序用例来说是可以接受的。

当然,我上面描述的所有这些缓存模式和场景都假设没有其他东西在修改 SOR/数据库。如果另一个外部应用程序或进程也在修改数据库,与基于 Geode 的应用程序分开,那么 Geode 可能与数据库不同步,您需要采取措施来识别这种情况。这是读取的问题,而不是写入的问题。当然,您还需要确保陈旧的缓存条目随后不会在更新时覆盖数据库。这很容易用乐观锁来处理。您甚至可以在数据库更新失败时触发缓存条目删除,以在读取时刷新缓存。

无论如何,这就是说,如果您正确应用了上述缓存模式中的 1 个,则缓存中的值应该已经反映在 DB 中(或者将反映在 Async,Write-Behind Caching UC 中),即使条目最终过期。

有意义吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。