我将要提高具有以下属性/体系结构的高速缓存繁重系统的效率:
系统具有2个组件,一个实例后端和多个前端实例,分布在远程数据中心。
后端生成数据并将其写入到关系数据库中,该关系数据库已复制到多个数据中心。
前端通过从数据库中读取数据并提供服务来处理客户端请求(基于常见的网络流量)。数据在过期之前会在本地缓存中存储一个小时,并且必须再次进行检索。
(缓存的逐出策略基于LRU)。
我想提到上面的实现有两个问题:
事实证明,许多数据库访问是冗余的,因为基础数据实际上并未更改。 另一方面,直到缓存TTL过去,更改才会反映出来,从而导致陈旧性问题。
您能提出解决这两个问题的解决方案吗?
如果数据存储在像cassandra这样的nosql数据库中而不是经典数据库中,解决方案应该改变吗?
答案 0 :(得分:1)
不幸的是,这里没有银弹。有两种明显的变体:
如果您的数据库足够强大并且具有可接受的延迟,则方法2是最简单的方法。
如果您的数据库没有可接受的延迟,或者您的应用程序正在针对每个Web请求对数据库进行多次顺序读取,则可以使用提供提前刷新或后台刷新的缓存。这意味着,高速缓存会自动刷新条目,并且除了第一次读取外没有其他延迟。但是,这种方法具有增加数据库负载的缺点。
Cassandra可能不支持经典数据库那样的访问策略。更改为Cassandara也会影响您的缓存,例如如果您还缓存查询结果。但是,高级概念保持不变。您的数据访问层可能会更改为异步或响应模式,因为Cassandara支持该模式。
如果要执行失效(解决方案1),请使用Cassandara从数据库中获取已更新数据的信息,请参见CASSANDRA-8844。您可能会从“经典” SQL数据库中获得类似的信息,但这是特定于供应商的功能。