【征服redis16】收官-redis缓存一致性问题解决方案

今天我们来写redis最后一篇:redis作为缓存时如何与数据库实现数据一致的问题。

最近看redis看得有点麻了,这篇就简单描述吧

目录

1.什么是缓存与数据库一致性问题

1.1 缓存一致性的概念

1.2 缓存不一致的场景

2.缓存不一致的解决思路


1.什么是缓存与数据库一致性问题

1.1 缓存一致性的概念

只要使用redis做缓存,就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。比如将商品的库存缓存在Redis,若库存数量不对,则下单时就可能出错,这是不能接受的。

缓存和DB的数据一致性包含如下情况:

  • 缓存有数据 缓存的数据值需和DB相同
  • 缓存无数据 DB必须是最新值

不符合这两种情况的,都属于缓存和DB数据不一致

1.2 缓存不一致的场景

目前常见的方式是先删缓存,再更新数据库,等请求获取缓存时,发现没有,从db获取 ,再重新赋值到缓存,这是最典型的缓存操作;

在正常请求下是不会有问题的,一但并发量起来了,就会产生如下问题

可能发生的问题1:

先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,缓存不一致发生。

可能发生的问题2:

没有按照规范操作,对于缓存未删除,直接更新数据库,数据库更新成功了,但是缓存更新失败了,导致缓存取到的值是旧值。

2.缓存不一致的解决思路

对于这个问题,我们公司采取的措施简单粗暴:

  1. 查询的时候先查缓存,没有了再查数据库。
  2. 删除或者更新的时候,先更新数据库,成功之后再删缓存,等待缓存下一步被自动更新。

这个很明显是有漏洞的,如果在查询的过程中被修改了,就会出现不一致的情况。不过我司并发度没那么高。

我们看到比较多的一种方案是这样的:延时双删

  1. 线程1删除缓存,然后去更新数据库

  2. 线程2来读缓存,发现缓存已经被删除,所以直接从数据库中读取,这时候由于线程1还没有更新完成,所以读到的是旧值,然后把旧值写入缓存

  3. 线程1,根据估算的时间,sleep,由于sleep的时间大于线程2读数据+写缓存的时间,所以缓存被再次删除

  4. 如果还有其他线程来读取缓存的话,就会再次从数据库中读取到最新值(不用线程sleep,这个耗线程池)

再一个思路是利用mq

这里可以利用类似于 阿里的canal 中间件模仿slave订阅mqsql的binlog日志,一当日志新增(add,update),就调用mq。不过这种方式需要加中间件,需要耗费mq资源,改动量大,结构也比较复杂。

还有一种简易的方式,就是设置缓存的过期时间,

每次放入缓存的时候,设置一个过期时间,比如5分钟,以后的操作只修改数据库,不操作缓存,等待缓存超时后从数据库重新读取。

如果对于一致性要求不是很高的情况,可以采用这种方案。

这个方案还会有另外一个问题,就是如果数据更新的特别频繁,不一致性的问题就很大了。

在实际生产中,我们有一些活动的缓存数据是使用这种方式处理的。

因为活动并不频繁发生改变,而且对于活动来说,短暂的不一致性并不会有什么大的问题。

这个问题在腾讯云社区有一个比较复杂的讨论:

Redis缓存与数据库一致性解决方案-腾讯云开发者社区-腾讯云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/340863.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pandas数据重采样

数据重采样 时间数据由一个频率转换到另一个频率 降采样(如D到M)升采样(如M到D) 方法:调用resample 降采样举例 import matplotlib.pyplot as plt import numpy as np import pandas as pd import datetime as dtrng…

git内部原理

git内部原理 介绍目录结构说明 介绍 项目的本地仓库中,包含一个隐藏的.git目录,其不同的文件产生都源于git的各种不同命令造成,文件目录如下所示: 目录结构说明 上面最核心重要的为object目录,目录最主要有三个对象…

【好用的AI工具】推荐测试人在用的Kimi Chat

一、功能介绍 发网址链接文章解析PDF文件分析,可以整理分析文章丢简历、给出面试问题聊天等 Kimi Chat 二、对于测试人带来的帮助 2.1 面试问题总结 问题一:Session和Cookie的区别 seeion 和 cookie 是两种不同的数据存储机制,它们在Web开…

C++ 并发编程 | 线程的状态

一、线程的状态 1、线程的状态 C线程有五种不同的状态:创建、就绪、运行、阻塞、终止。掌握线程状态可帮助我们跟踪程序的执行过程,并解决潜在的竞态条件和死锁问题,掌握它对于编写可靠和高效的多线程应用程序至关重要。下面分别介绍这几种状…

利用Intersection Observer实现图片懒加载性能优化

Intersection Observer是浏览器所提供的一个 Javascript API,用于异步的检测目标元素以及祖先或者是顶级的文档视窗的交叉状态 这句话的意思就是: 我们可以看的图片当中,绿色的 target element(目标元素)&#xff0c…

1.12马原总复习TOTAL

(价值形式)不变资本、可变资本 不变资本是以生产资料形态存在的资本,通过具体劳动转移到新产品中,价值量不会大于它原本的价值量; 可变资本是用来购买劳动力的资本,产生剩余价值 可变资本里,…

搭建一个简单的Spring Demo

要学习Spring 源码,一个是从Spring GitHub 上去down源码,然后倒入IDEA编译,但这种方法费时费力,如果你不需要对Spring 源码进行修改后,再编译的话,直接搭建一个Spring Demo 的Maven项目,引入Spr…

官宣首批 CESS 全球大使,更多席位邀您报名参与!

CESS(Cumulus Encrypted Storage System)很荣幸地向大家宣布「CESS 全球大使计划」的首批入选大使! CESS 全球大使计划旨在汇聚全球对区块链技术充满热情、愿意为 CESS 生态做出贡献的建设者。该计划专注于提升社区知名度和影响力&#xff0c…

数据库复试—关系数据库标准语言SQL

数据库复试—关系数据库标准语言SQL SQL:结构化查询语言 以教材中的学生-课程数据库为例进行SQL基础语法的复习 数据库实验环境选择SQLServer 11 关系模式 学生表Student(Sno,Sname,Ssex,Sage,Sdept) 课程表Course(Cno,Cname,Cpno,Ccredit) 学生选课表SC&#xf…

2526. 随机数生成器(BSGS,推导)

题目路径: https://www.acwing.com/problem/content/2528/ 思路:

WPF 在DataGrid使用过程中,如果单击某一行理论就会选中哪一行,实际不能选中。DataGrid空白格不能选择行

wpf 在DataGrid使用过程中,如果单击某一行理论就会选中哪一行,但是单击的点刚好这列没有值、内容为空时,单击了也没有选中这一行。如果这列有值就容易选中这一行,这是为什么,如何解决? 确保列模板中即使没有…

Yolov8不废话!参考手册!

Yolov8使用 yolo taskdetect modetrain modelyolov8n.pt args...classify predict yolov8n-cls.yaml args...segment val yolov8n-seg.yaml args...export yolov8n.pt formatonnx args...使用Ultralytics YOLO进行模型训练 …

设置代码模板创建sql映射文件、Mybatis主配置文件

目录 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 2、Mybatis的主配置文件的介绍 3、通过代码模板创建Sql映射文件 4、通过代码模板创建Mybatis主配置文件 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 <?xml version"1.0" encod…

UCIE协议介绍--芯粒间互联标准

UCIE协议介绍--芯粒间互联标准 1 背景2 UCIE协议介绍2.1 协议层2.2 适配层2.3 物理层2.4 D2D接口 3 Transmission3.1 SideBand数据包3.2 SideBand包格式3.2.1 MRd/Mwr/CfgRd/CfgWr3.2.2 Completion3.2.3 Message 3.3 FDI接口信号 4 链路训练4.1 PHY LSM状态介绍 1 背景 为什么…

Windows 下使用C#开启蓝牙(未解决的坑)

需求 当程序检测到蓝牙未打开时需要程序自动将W10的蓝牙开启。 资料 Turn on/off Bluetooth radio/adapter from cmd/powershell in Windows 10 - Super User 上的这个连接是通过powershell 开启蓝牙具体代码如下 [CmdletBinding()] Param ([Parameter(Mandatory$true)][V…

代码随想录算法训练营第十三天 |239.滑动窗口最大值,347.前k个高频元素(待补充)

239.滑动窗口最大值 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、视频讲解&#xff1a; 单调队列正式登场&#xff01;| LeetCode&#xff1a;239. 滑动窗口最大值_哔哩哔哩_bili…

LeetCode 热题 100 | 滑动窗口

目录 1 3. 无重复字符的最长子串 2 438. 找到字符串中所有字母异位词 菜鸟做题第二周&#xff0c;语言是 C 1 3. 无重复字符的最长子串 解题思路&#xff1a; 设置两个指针&#xff0c;左指针和右指针&#xff0c;二者之间形成窗口右指针不断右移&#xff0c;新字母被纳…

百家云BRTC的解决方案

随着网络实时通信技术&#xff08;Web Real-Time Communication&#xff0c;简称WebRTC&#xff09;的不断发展和普及&#xff0c;webRTC已成为现代互联网通讯领域的核心技术之一。它体现在方方面面比如&#xff1a; 实时视频通话&#xff1a; WebRTC 可以用于实现浏览器之间的…

开源运维监控工具Uptime Kuma本地部署并结合内网穿透实现公网访问

目录 主要功能 一、前期准备 本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。 本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma 三、实现公网查看网站监控 四、使用固定公网地址…

网管协议SNMPv1/v2c的配置案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…