关于缓存和数据库强一致的可行方案

简介: 前言我们在日常工作中经常会遇到要求缓存和数据库强一致性的问题,我们平常的做法是,确保数据库插入成功,然后再更新缓存,但有时候数据库插入成功后,缓存出现问题或者缓存系统挂了,这时候请求会直接访问数据库最新的数据,但是当缓存恢复的时候,我们的并发请求又会访问到以前旧的缓存数据,这时候就会出现不一致问题。

前言

我们在日常工作中经常会遇到要求缓存和数据库强一致性的问题,我们平常的做法是,确保数据库插入成功,然后再更新缓存,但有时候数据库插入成功后,缓存出现问题或者缓存系统挂了,这时候请求会直接访问数据库最新的数据,但是当缓存恢复的时候,我们的并发请求又会访问到以前旧的缓存数据,这时候就会出现不一致问题。如果我们的业务系统对一致性要求不高,那么可以这么做,但是如果必须是强一致性,那么这个方案是有明显漏洞的。

有的朋友可能会说,当缓存恢复的时候直接清空缓存就可以了,然后重新加载一遍,这样有二个问题,第一个是我们的缓存数据有一部分其实是不经常变动的,全部清空再加载效率就非常低了。

方案一讲解

  • 数据写入端
Paste_Image.png

注:同样我们是同时写数据库和缓存,但是在写缓存的时候会判断写入是否成功,如果写入出错,我们将key和更新状态值插入到数据库状态表中,同时关闭前端访问缓存的开关。

  • 数据读入端
Paste_Image.png

注:客户端在读数据的时候,要先判断一下当然开关是否打开,如果打开则读取缓存,如果关闭则直接访问数据库。关于判断缓存开关的问题,可以不用每次读库,而可以事先缓存到本地。

  • 缓存恢复端
Paste_Image.png

注:后台有一个守护定时任务,每隔一定时间来检测缓存系统是否可用,如果可用则从状态表中读取key值和更新状态位,然后打开缓存读取开关,这样前端数据读取端则能够从缓存读取最新数据。

  • 总结

这方案的前提是当前并发量并不是非常大的情况,试想如果当前并发非常大,同时缓存又出了问题,这时候整个请求就穿透到了数据库层造成严重问题。

那么我之前的初步想法是将这个流程封装为中间件,根据不同库配置不同的数据源,客户端只需要直接请求中间件即可。但此方案不适合分库分表的场景!在某种情况下是有局限性的!这个方案更多是为大家提供一种思路!

方案二讲解

当缓存不可用时,在第一时间不对数据库服务发起请求,在需要的时候异步填充缓存(优先热点缓存),然后我们将前端的请求直接返回失败,也就是快速返回失败,直到缓存恢复并且热点缓存填充完毕。

Paste_Image.png

注:在某些情况下,这种方法意义不大,但当系统的一部分发生故障时可以确保系统仍然可用的一种方式,让请求快速失败,确保不占用资源,也避免了级联下游服务的故障。

相关文章
【YashanDB知识库】OM仲裁节点故障后手工切换方案和yasom仲裁重新部署后重新纳管数据库集群方案
本文介绍了主备数据库集群的部署、OM仲裁故障切换及重新纳管的全过程。首先通过解压软件包并调整安装参数完成数据库集群部署,接着说明了在OM仲裁故障时的手动切换方案,包括关闭自动切换开关、登录备节点执行切换命令。最后详细描述了搭建新的yasom仲裁节点以重新纳管数据库集群的步骤,如生成配置文件、初始化进程、执行托管命令等,确保新旧系统无缝衔接,保障数据服务稳定性。
WordPress数据库查询缓存插件
这款插件通过将MySQL查询结果缓存至文件、Redis或Memcached,加速页面加载。它专为未登录用户优化,支持跨页面缓存,不影响其他功能,且可与其他缓存插件兼容。相比传统页面缓存,它仅缓存数据库查询结果,保留动态功能如阅读量更新。提供三种缓存方式选择,有效提升网站性能。
46 1
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
107 9
【YashanDB 知识库】OM 仲裁节点故障后手工切换方案和 yasom 仲裁重新部署后重新纳管数据库集群方案
本文介绍了一主一备数据库集群的部署步骤。首先在OM节点上传并解压软件包至指定路径,随后通过调整安装参数、执行安装和集群部署完成数据库设置。接着,在主备节点分别配置环境变量,并查看数据库状态以确认安装成功。最后,针对OM仲裁故障提供了手动切换方案,包括构造故障场景、关闭自动切换开关及使用SQL命令进行主备切换,确保系统高可用性。
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
云数据库Tair:从稳定低延时缓存到 Serverless KV
本次分享聚焦云数据库Tair的使用,涵盖三部分内容:1) Tair概览,介绍其作为稳定低延时缓存及KV数据库服务的特点和优势;2) 稳定低延迟缓存技术,探讨如何通过多线程处理、优化内核等手段提升性能与稳定性;3) 从缓存到Serverless KV的演进,特别是在AI大模型时代,Tair如何助力在线服务和推理缓存加速。Tair在兼容性、性能优化、扩缩容及AI推理加速方面表现出色,满足不同场景需求。
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等