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

nwlqm0z1  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(360)

我们有一个使用sql数据库的企业应用程序。数据库访问特性是大约90%的读取。更新或创建的数据需要立即更新。缓存需要以高确定性正确地失效。在98%的情况下,实体通过其主键引用。
该应用程序基于node.js,是aws本机应用程序。由于应用程序是aws本机的,所以我希望依赖aws提供的托管服务,而不是托管自己的服务。一种选择是实现基于redis的读缓存。在检索实体时,我们会检查缓存,如果数据没有缓存,我们会在将其交给用户之前将其放入缓存。更新这些实体的代码部分将按主键使缓存失效。
一般来说,在计算机科学中,缓存一致性是最具挑战性的问题之一。我认为,与其实现redis缓存并考虑所有可能的场景来正确地使其失效,不如将aurora read副本专门配置为读取频繁访问的实体。rdbms在缓存方面比我们自己构建的任何东西都做得更好。
因此,我面临两种选择——实现自己的缓存,或者使用读取副本。我个人的意见是使用读取副本。
如有任何建议,我们将一如既往,不胜感激。

pepwfjgg

pepwfjgg1#

是的,你说得对,缓存失效是个棘手的问题。最简单的解决方案是向数据写入中添加代码,以替换缓存的值。所以它们总是最新的。但是,只有当缓存的值与数据库中的行具有几乎1:1的相关性时,这才是容易的。
您自己的缓存的一个优点是,您可以缓存与数据库中的数据行不是1:1的数据。例如,您可以为下拉菜单缓存整个html片段。这可能是几个sql查询的结果。可以说,缓存位于“食物链”更高层的数据可能是一个相当大的优势。但是缓存失效变得不那么简单。最适合存储不经常更改的查询结果。
使用读取副本不能代替使用缓存。查询一个读取的副本仍然有建立数据库连接、身份验证、sql查询解析和优化、锁定以及rdbms工作的所有其他开销。
从缓存中查询数据的速度可以快几个数量级。
两者都有各自的位置。对于不同的任务,最好同时使用缓存和读取副本。我还将添加消息队列作为一项重要技术。我相信数据库、缓存和队列形成了一个三条腿的凳子。
但你必须有经验和判断力,才能知道什么时候每一个都是一个特定案例的最佳工具。

相关问题