Mysql 我应该实现自己的缓存还是依赖读取副本?

Mysql 我应该实现自己的缓存还是依赖读取副本?,mysql,node.js,amazon-web-services,caching,redis,Mysql,Node.js,Amazon Web Services,Caching,Redis,我们有一个使用SQL数据库的企业应用程序。数据库访问特性是大约90%的读取。需要立即更新或创建最新的数据。缓存需要以高确定性正确地失效。98%的情况下,实体通过其主键引用 该应用程序基于Node.js,是AWS本机应用程序。由于应用程序是AWS本机的,我希望依赖AWS提供的托管服务,而不是托管自己的服务。一种选择是实现基于Redis的读缓存。在检索实体时,我们会检查缓存,如果数据没有缓存,我们会将其放入缓存中,然后再将其交给用户。更新这些实体的代码部分将按主键使缓存无效 一般来说,在计算机科学中

我们有一个使用SQL数据库的企业应用程序。数据库访问特性是大约90%的读取。需要立即更新或创建最新的数据。缓存需要以高确定性正确地失效。98%的情况下,实体通过其主键引用

该应用程序基于Node.js,是AWS本机应用程序。由于应用程序是AWS本机的,我希望依赖AWS提供的托管服务,而不是托管自己的服务。一种选择是实现基于Redis的读缓存。在检索实体时,我们会检查缓存,如果数据没有缓存,我们会将其放入缓存中,然后再将其交给用户。更新这些实体的代码部分将按主键使缓存无效

一般来说,在计算机科学中,缓存一致性是最具挑战性的问题之一。我认为,与其实现Redis缓存并考虑所有可能的场景以正确地使其失效,不如将Aurora read副本专门配置为读取频繁访问的实体。RDBMS在缓存方面比我们自己构建的任何东西都做得更好

因此,我面临两种选择——实施自己的缓存,或者使用读取副本。我个人的意见是使用读取副本


如往常一样,我们非常感谢您的任何建议。

是的,您是对的,缓存失效是一个棘手的问题。最简单的解决方案是向数据写入中添加代码,以替换缓存的值。所以它们总是最新的。但是,只有当缓存的值与数据库中的行具有几乎1对1的相关性时,这才很容易

您自己的缓存的一个优点是,您可以缓存与数据库中的数据行不是1:1的数据。例如,您可以为下拉菜单缓存整个HTML片段。这可能是几个SQL查询的结果。可以说,缓存位于“食物链”更高层的数据可能是一个很大的优势。但是缓存失效变得不那么简单。最适合存储不经常更改的查询结果

使用读取副本不能替代使用缓存。查询读取副本仍然需要进行数据库连接、身份验证、SQL查询解析和优化、锁定以及RDBMS工作中的所有其他开销

从缓存查询数据的速度可以快几个数量级

两者都有各自的位置。对于不同的任务,最好同时使用缓存和读取副本。我还将添加消息队列作为一项重要技术。我相信数据库、缓存和队列构成了一个三条腿的凳子


但你必须有经验和判断力,才能知道什么时候每一个都是特定案例的最佳工具。

我认为你一针见血——对不经常更改的内容使用缓存,如果由于错误或其他情况而导致无效性被遗漏,这是可以的,并使用读取副本提高读取性能的通用性。