我们有一个使用 SQL 数据库的企业应用程序。数据库访问特征是大约 90% 的读取。更新或创建的数据需要立即更新。缓存需要以高确定性正确无效。在 98% 的情况下,实体由其主键引用。
该应用程序基于 Node.js 并且是 AWS 原生的。由于该应用程序是 AWS 原生的,我希望依赖 AWS 的托管服务而不是托管我自己的服务。一种选择是实现我们基于 Redis 的通读缓存。检索实体后,我们会检查缓存,如果数据未缓存,我们会在将其交给用户之前将其放入缓存中。更新这些实体的代码部分将通过主键使缓存失效。
一般来说,在计算机科学中,缓存一致性是最难解决的问题之一。我的观点是,与其实现 Redis 缓存并考虑所有可能的场景以使其正确失效,不如配置专门用于读取频繁访问的实体的 Aurora 只读副本更为明智。 RDBMS 在缓存方面将比我们自己构建的任何东西做得更好。
因此,我面临两个选择——努力实现我自己的缓存,或者使用只读副本。我个人的意见是使用只读副本。
一如既往地非常感谢任何建议。
最佳答案
是的,你是对的,缓存失效是一个棘手的问题。最简单的解决方案是将代码添加到您的数据写入中,以替换缓存的值。所以它们总是最新的。但只有当缓存值与数据库中的行具有几乎一对一的相关性时,这才容易。
您自己的缓存的一个优点是您可以缓存与数据库中的数据行不是一对一的数据。例如,您可以为下拉菜单缓存整个 HTML 片段。这可能是多个 SQL 查询的结果。可以这么说,缓存位于“食物链”更高层的数据可能是一个很大的优势。但是缓存失效变得不那么简单了。最适合存储不经常更改的查询结果。
使用只读副本不能替代使用缓存。查询只读副本仍然有建立数据库连接、身份验证、SQL 查询解析和优化、锁定以及所有其他进入 RDBMS 工作的开销。
从缓存中查询数据的速度可以提高几个数量级。
两者都有自己的位置。对于不同的任务,最好同时使用缓存和只读副本。我还将消息队列添加为一项重要技术。我认为数据库、缓存和队列是一个三足凳。
但您必须具备经验和判断力,才能知道每种工具何时是针对给定案例的最佳工具。
关于mysql - 我应该实现自己的缓存还是依赖只读副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49861361/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.