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

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

前言

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

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

方案一讲解

  • 数据写入端
Paste_Image.png

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

  • 数据读入端
Paste_Image.png

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

  • 缓存恢复端
Paste_Image.png

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

  • 总结

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

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

方案二讲解

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

Paste_Image.png

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

目录
相关文章
|
2月前
|
缓存 并行计算 监控
vLLM 性能优化实战:批处理、量化与缓存配置方案
本文深入解析vLLM高性能部署实践,揭秘如何通过continuous batching、PagedAttention与前缀缓存提升吞吐;详解批处理、量化、并发参数调优,助力实现高TPS与低延迟平衡,真正发挥vLLM生产级潜力。
541 0
vLLM 性能优化实战:批处理、量化与缓存配置方案
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
607 5
|
9月前
|
SQL 关系型数据库 数据库
【YashanDB知识库】OM仲裁节点故障后手工切换方案和yasom仲裁重新部署后重新纳管数据库集群方案
本文介绍了主备数据库集群的部署、OM仲裁故障切换及重新纳管的全过程。首先通过解压软件包并调整安装参数完成数据库集群部署,接着说明了在OM仲裁故障时的手动切换方案,包括关闭自动切换开关、登录备节点执行切换命令。最后详细描述了搭建新的yasom仲裁节点以重新纳管数据库集群的步骤,如生成配置文件、初始化进程、执行托管命令等,确保新旧系统无缝衔接,保障数据服务稳定性。
|
4月前
|
缓存 运维 安全
WordPress安全加速:Cloudflare + Nginx缓存优化方案
本文介绍如何通过Cloudflare与Nginx优化WordPress网站性能,涵盖静态资源长期缓存、动态页面智能缓存及敏感路径保护,提升加载速度并保障后台安全。适用于使用Cloudflare与Nginx环境的WordPress站点。
214 0
|
9月前
|
缓存 NoSQL 关系型数据库
WordPress数据库查询缓存插件
这款插件通过将MySQL查询结果缓存至文件、Redis或Memcached,加速页面加载。它专为未登录用户优化,支持跨页面缓存,不影响其他功能,且可与其他缓存插件兼容。相比传统页面缓存,它仅缓存数据库查询结果,保留动态功能如阅读量更新。提供三种缓存方式选择,有效提升网站性能。
176 1
|
9月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
9月前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
10月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
466 9
|
11月前
|
存储 缓存 NoSQL
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
324 1
|
11月前
|
缓存 NoSQL 关系型数据库
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
252 1