【问题标题】:regarding of improvement of the efficiency of a cache heavy system关于提高高速缓存重系统的效率
【发布时间】:2019-06-07 17:35:43
【问题描述】:

我即将提高缓存重系统的效率,该系统具有以下属性/架构:

该系统有 2 个组件,一个后端实例和多个前端实例,分布在远程数据中心。

后端生成数据并将其写入到复制到多个数据中心的关系数据库。

前端通过从数据库读取数据并提供服务来处理客户端请求(基于常见的 Web 流量)。数据在过期前会在本地缓存中存储一​​个小时,并且必须再次检索。

(缓存的驱逐策略是基于 LRU 的)。

我想提一下,上面的实现有两个问题:

事实证明,许多数据库访问是多余的,因为底层数据实际上并没有改变。 另一方面,在缓存 TTL 过去之前不会反映更改,从而导致过时问题。

您能否建议解决这两个问题的解决方案?

如果数据存储在 nosql db(如 cassandra)而不是经典数据库中,是否应该更改解决方案?

【问题讨论】:

    标签: java caching responsive-design architecture microservices


    【解决方案1】:

    不幸的是,这里没有灵丹妙药。有两种明显的变体:

    1. 保持长 TTL 或永久缓存,但更新时缓存数据无效。这可能会变得相当复杂且容易出错
    2. 只需降低 TTL 即可获得更快的更新。低 TTL 方法是恕我直言的 KISS 方法。我们低至 27 秒。具有这种低 TTL 的缓存在正常操作期间不会有很多命中,但在闪存人群袭击您的应用程序时会有很大帮助

    如果您的数据库足够强大并且具有可接受的延迟,则方法 2 是最简单的一种。

    如果您的数据库没有可接受的延迟,或者您的应用程序可能对每个 Web 请求从数据库进行多次顺序读取,那么您可以使用提供提前刷新或后台刷新的缓存。这意味着,缓存会自动刷新条目,并且除了第一次读取之外没有额外的延迟。但是,这种方法有增加数据库负载的缺点。

    Cassandra 可能不支持与经典数据库相同的访问策略。更改为 Cassandara 也会影响您的缓存,例如如果您还缓存查询结果。但是,高级概念保持不变。您的数据访问层可能会更改为异步或反应模式,因为 Cassandara 对此提供了支持。

    如果您想进行失效(解决方案 1),使用 Cassandara,您可以从数据库中获取更新了哪些数据的信息,请参阅CASSANDRA-8844。您可能会从“经典”SQL 数据库中获得类似的信息,但这是供应商特定的功能。

    【讨论】:

    • 嗨 cruftex 非常感谢! (:如果数据存储在 Cassandra 而不是经典数据库中,您能否提供更多详细信息来说明解决方案将如何变化?
    • 我也不确定您提到的 2 个变体是否与我提到的 2 个问题相关
    • 你所说的不要“雇佣”是什么意思
    • 如果您的写入量不是那么大,那么最好将数据缓存在内存 (Redis) 服务器中,并且每次写入都应使 redis 服务器上的相关键无效,以便您始终转到缓存丢失键的持久存储
    猜你喜欢
    • 2013-03-27
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多