当前位置: 首页 > news >正文

《程序猿之Redis缓存实战 · Redis 与数据库一致性》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • Redis 与数据库一致性

Redis 与数据库一致性

【问题背景】

使用Redis做一个缓存操作,让请求先访问到redis,而不是直接访问MySQL等数据库。

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新(数据库和缓存更新),就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。

不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。

【方案一:延时双删】

先删除Redis缓存数据,再更新Mysql,延迟几百毫秒再删除Redis缓存数据,这样就算在更新Mysql时,有其他线程读了Mysql,把老数据读到了Redis中,那么也会被删除掉,从而把数据保持一致。

延时双删 是一种常见的解决 Redis 和数据库一致性问题的方案,它可以有效地降低数据不一致的概率。

原理:

  • 写入 Redis: 当用户修改数据时,先写入 Redis 缓存。
  • 异步更新数据库: 同时异步地将修改操作发送到数据库进行更新。
  • 延时删除 Redis: 为了防止数据库更新失败导致数据不一致,在数据库更新成功后,延时一段时间再删除 Redis 缓存。

优点:

  • 提高性能: 由于大部分请求都命中缓存,可以有效地提高系统性能。
  • 降低数据不一致的概率: 延时删除可以确保数据库更新成功后,Redis 缓存才会被删除,从而降低数据不一致的概率。

缺点:

  • 存在短暂的数据不一致: 在延时删除期间,Redis 缓存和数据库数据可能存在短暂的不一致。
  • 需要额外的逻辑: 需要实现延时删除机制,增加代码复杂度。

适用场景:

  • 对于对数据一致性要求不高的场景,延时双删是一个不错的选择。
  • 对于需要高性能的场景,延时双删可以有效地提高系统性能。
@Component
public class CacheUtil {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 删除数据的方法public void deleteWithDelay(String key, String dbKey) {// 第一次删除 Redis 中的数据redisTemplate.delete(key);// 等待一段时间(例如 500 毫秒)try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 从数据库中删除数据(假设有一个数据库操作的方法)deleteFromDatabase(dbKey);// 再次删除 Redis 中的数据redisTemplate.delete(key);}// 模拟从数据库中删除数据的方法private void deleteFromDatabase(String dbKey) {// 实际的数据库删除逻辑System.out.println("Deleting from database: " + dbKey);// 例如:repository.deleteById(dbKey);}
}

【其他方案】

1、队列 + 重试机制

2、异步更新缓存(基于订阅binlog的同步机制)

相关文章:

《程序猿之Redis缓存实战 · Redis 与数据库一致性》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

【无标题】observer: error while loading shared libraries: libmariadb.so.3处理办法

文章目录 1.记录新装的oceanbase,使用observer帮助时&#xff0c;出现lib文件无法找到的处理过程 ./observer --help ./observer: error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or directory2.做一个strace跟踪&…...

极客兔兔Gee-Cache Day1

极客兔兔7Days GeeCache - Day1 interface{}&#xff1a;任意类型 缓存击穿&#xff1a;一个高并发的请求查询一个缓存中不存在的数据项&#xff0c;因此这个请求穿透缓存直接到达后端数据库或数据源来获取数据。如果这种请求非常频繁&#xff0c;就会导致后端系统的负载突然…...

[MAUI]数据绑定和MVVM:MVVM的属性验证

一、MVVM的属性验证案例 Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以下案例实现对UI层的姓名和年龄两个输入框,进行表单提交验证。实现效果如下所示 View<ContentP…...

2024年水利水电安全员考试题库及答案

一、判断题 1.采用水下钻孔爆破方案时&#xff0c;侧面应采用预裂爆破&#xff0c;并严格控制单响药量以保护附近建&#xff08;构&#xff09;筑物的安全。 答案&#xff1a;正确 2.围堰爆破拆除工程的实施应成立爆破指挥机构&#xff0c;并应按设计确定的安全距离设置警戒。…...

【快速删除 node_modules 】rimraf

目录 1. 什么是node_modules 2. 卸载一个npm包 3. 删除 node_modules 为什么这么慢 4. rimraf 5. 为什么rimraf 这么快 作为前端开发&#xff0c;无论我们关注不关注&#xff0c;每天都能接触到node_modules。通常产生于一个npm install命令&#xff0c;之后就不会多加关注…...

毕业设计选题:基于ssm+vue+uniapp的教学辅助小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…...

13-指针和动态内存-内存泄漏

一、视频笔记&#xff1a; C语言通过malloc&#xff0c;来获取堆上的内存。 动态调用内存&#xff1a; malloc 和 free &#xff1b;new 和 delete 都行。 内存泄漏指的是我们动态申请了内存&#xff0c;但是即是是使用完了之后&#xff08;从来都不去释放它&#xff09;。只…...

基于深度学习的视频摘要生成

基于深度学习的视频摘要生成是一种通过自动化方式从长视频中提取关键片段&#xff0c;生成简洁且有代表性的视频摘要的技术。其目的是在保留视频主要内容的基础上&#xff0c;大幅缩短视频的播放时长&#xff0c;方便用户快速理解视频的核心信息。以下是视频摘要生成的主要方法…...

适合初学者的[JAVA]: 基础面试题

目录 说明 前言 String/StringBuffer/StringBuilder区别 第一点: 第二点: 总结&#xff1a; 反射机制 JVM内存结构 运行时数据区域被划分为5个主要组件&#xff1a; 方法区&#xff08;Method Area&#xff09; 堆区&#xff08;Heap Area&#xff09; 栈区&#x…...

internal.KaptWithoutKotlincTask$KaptExecutionWorkAction 问题 ---Room数据库

Caused by: java.lang.Exception: No native library is found for os.nameMac and os.archaarch64. path/org/sqlite/native/Mac/aarch64 m3 目前使用的是MAC M3芯片的配置会出现这个问题。M1就应该就有这个问题 解决&#xff1a; 在project层级的build.gradle中的allprojec…...

Frequency-aware Feature Fusion for Dense Image Prediction 论文阅读

摘要:密集图像预测任务要求具有强类别信息和高分辨率精确空间边界细节的特征。为了实现这一点&#xff0c;现代分层模型通常利用特征融合&#xff0c;直接添加来自深层的上采样粗特征和来自较低层次的高分辨率特征。在本文中&#xff0c;我们观察到融合特征值在对象内的快速变化…...

Springboot + netty + rabbitmq + myBatis

目录 0.为什么用消息队列1.代码文件创建结构2.pom.xml文件3.三个配置文件开发和生产环境4.Rabbitmq 基础配置类 TtlQueueConfig5.建立netty服务器 rabbitmq消息生产者6.建立常规队列的消费者 Consumer7.建立死信队列的消费者 DeadLetterConsumer8.建立mapper.xml文件9.建立map…...

电磁兼容(EMC):整改案例(四)人体对EFT测试影响有多大?

目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试&#xff0c;测试条件为&#xff1a;频率5kHz/100kHz&#xff0c;测试电压L&#xff0c;N线间2kV&#xff0c;L&#xff0c;N线对PE线4kV。测试过程中需要…...

数据可视化基础:让数据说话

一、引言 在信息洪流中&#xff0c;数据可视化如同灯塔&#xff0c;照亮了数据的海洋&#xff0c;让我们能够洞察数据背后的意 义。 下面是对数据可视化的详细介绍&#xff0c;包括定义、作用、类型、原则、工具方法以及应用场景&#xff0c; 并附上具体的代码示例。 二、数…...

有哪些优化数据库性能的方法?如何定位慢查询?数据库性能优化全攻略:从慢查询定位到高效提升

在现代应用程序开发中&#xff0c;数据库的性能对于整体系统的响应能力至关重要。随着用户数量的增加和数据量的增长&#xff0c;如何优化数据库性能、定位慢查询成了每一个开发者面临的重要挑战。今天&#xff0c;我想和大家分享一些实用的数据库性能优化方法&#xff0c;以及…...

C语言 | Leetcode C语言题解之第450题删除二叉搜索树中的节点

题目&#xff1a; 题解&#xff1a; struct TreeNode* deleteNode(struct TreeNode* root, int key){struct TreeNode *cur root, *curParent NULL;while (cur && cur->val ! key) {curParent cur;if (cur->val > key) {cur cur->left;} else {cur c…...

智慧防灾,科技先行:EasyCVR平台助力地质灾害视频监测系统建设

随着科技的飞速发展&#xff0c;视频监控技术已成为地质灾害监测与预警的重要手段之一。在众多视频监控平台中&#xff0c;EasyCVR视频汇聚平台凭借其强大的视频整合、实时传输、视频处理及分发等能力&#xff0c;在地质灾害场景中展现出显著的应用优势。 一、实时监测与远程监…...

掌握C#核心概念:类、继承、泛型等

C# 是一门功能强大且灵活的面向对象编程语言&#xff0c;它结合了许多现代编程语言的特点和特性。无论你是编程新手&#xff0c;还是有经验的开发者&#xff0c;理解C#中的核心概念都是非常重要的。本文将介绍C#中的类与对象、构造函数和析构函数、方法的重载与重写、继承与多态…...

[VULFOCUS刷题]tomcat-pass-getshell 弱口令

tomcat-pass-getshell 弱口令 启动容器&#xff0c;打开网站 点开manageapp&#xff0c;输入弱口令 tomcat/tomcat 之后在下面上传jsp大马&#xff0c;首先生成一个jsp马 这里我直接使用github别人生成好的 tennc/webshell: This is a webshell open source project (github.…...

告别音乐标签混乱难题:Music Tag Web的智能高效解决方案

告别音乐标签混乱难题&#xff1a;Music Tag Web的智能高效解决方案 【免费下载链接】music-tag-web 音乐标签编辑器&#xff0c;可编辑本地音乐文件的元数据&#xff08;Editable local music file metadata.&#xff09; 项目地址: https://gitcode.com/gh_mirrors/mu/musi…...

YOLO X Layout中小企业应用:无需训练,开箱即用的文档结构理解AI工具

YOLO X Layout中小企业应用&#xff1a;无需训练&#xff0c;开箱即用的文档结构理解AI工具 1. 引言&#xff1a;让文档理解变得简单高效 在日常办公中&#xff0c;我们经常需要处理各种文档——扫描的合同、拍摄的表格、电子版报告。传统方式需要人工逐个识别文档中的文字、…...

智能简化黑苹果配置:OpCore Simplify为技术爱好者打造的自动化解决方案

智能简化黑苹果配置&#xff1a;OpCore Simplify为技术爱好者打造的自动化解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify OpCore Simplify是…...

AI原生应用开发:边缘设备上的实时目标检测实现

AI原生应用开发&#xff1a;边缘设备上的实时目标检测实现关键词&#xff1a;AI原生应用开发、边缘设备、实时目标检测、计算机视觉、深度学习摘要&#xff1a;本文聚焦于AI原生应用开发中在边缘设备上实现实时目标检测这一重要课题。详细介绍了边缘设备实时目标检测的核心概念…...

从零开始掌握KLayout版图设计:5个步骤打造专业集成电路设计流程

从零开始掌握KLayout版图设计&#xff1a;5个步骤打造专业集成电路设计流程 【免费下载链接】klayout KLayout Main Sources 项目地址: https://gitcode.com/gh_mirrors/kl/klayout KLayout版图设计工具是开源EDA领域的明星产品&#xff0c;为集成电路设计工程师提供了一…...

OpenClaw+QwQ-32B成本对比:自建模型如何节省90%API费用

OpenClawQwQ-32B成本对比&#xff1a;自建模型如何节省90%API费用 1. 为什么我要做这次成本实验 去年冬天&#xff0c;当我第一次用OpenClaw对接GPT-4完成月度报表自动化时&#xff0c;账单上的数字让我倒吸一口冷气——连续执行3天的数据整理任务&#xff0c;竟然消耗了价值…...

【图像计数】基于matlab GUI图像处理颗粒自动计数【含Matlab源码 15231期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…...

OpenClaw+QwQ-32B客服模拟:电商问答自动化测试

OpenClawQwQ-32B客服模拟&#xff1a;电商问答自动化测试 1. 为什么需要自动化客服测试 去年双十一前&#xff0c;我们团队遇到了一个棘手问题&#xff1a;每次大促前&#xff0c;客服团队都要手动测试上百个产品页面的问答话术。人工测试不仅耗时耗力&#xff0c;还经常遗漏…...

如何快速掌握B站视频下载:DownKyi面向新手的终极教程

如何快速掌握B站视频下载&#xff1a;DownKyi面向新手的终极教程 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#x…...

PROJECT MOGFACE效果对比:不同提示词(Prompt)工程下的输出质量

PROJECT MOGFACE效果对比&#xff1a;不同提示词&#xff08;Prompt&#xff09;工程下的输出质量 你是不是也遇到过这种情况&#xff1f;用同一个AI模型&#xff0c;别人生成的回答妙语连珠&#xff0c;你得到的却平平无奇。问题可能就出在那几句“悄悄话”——提示词上。 今…...