Redis-2 双写一致性

news/2024/9/22 22:21:37/
  • 双写一致性

一.什么是双写一致性?

数据库中的数据修改后,也要修改缓存中的数据,保证数据库缓存中保存的数据一致。

二.如何保证双写一致性?

回答该问题一定要结合自己的项目,说明自己的项目是必须强一致性还是允许延迟一致。

针对必须强一致性的项目:

方案一.延迟双删

1.实施:依次执行操作:删除缓存——修改数据库——延时——删除缓存

2.为什么要两次删除缓存

(1)第一次删除缓存是因为:修改数据库中的数据后,缓存中保存的相当于过期数据,所以删除。

(2)第二次删除是因为:假设线程1删除了缓存中的数据,但还未修改数据库中的数据;此时线程2得到了时间片去查询已经被删除的数据,由于缓存中的数据已经被删除,线程2会进行缓存重建,把数据库中的数据又重新写入缓存;当线程1重新获得时间片修改完数据库后,就会出现数据库缓存中的数据不一致的情况,因此还需要再删除一次缓存

3.为什么要延时:

通常情况下数据库采用主从模式,延时是为了等待数据库将数据从主节点同步到从节点。

方案二.分布式锁

1.使用两把锁:

(1)共享锁:又叫读锁readlock,加锁之后,其他线程可以共享读操作,但不能进行写操作。

(2)排他锁:又叫独占锁writelock,加锁之后,其他线程的读写操作都被阻塞。

2.使用:在进行读操作时添加共享锁,读读不互斥,写互斥;在进行写操作时添加独占锁,读写互斥。

针对允许延迟一致的项目:

方案一.使用消息队列MQ

1.实施:进行修改数据库操作后,会发送消息给MQ;缓存服务会监听MQ,收到数据库修改操作的信息后,会更新缓存,以此来保持数据的最终一致性。

方案二.使用Canal

1.实施:进行修改数据库操作后,数据库会将该操作记录到二进制日志文件binlog中,canal会监听数据库的binlog,发现修改操作后会通知缓存服务更新缓存,以此来保持数据的最终一致性。

2.优点:对业务代码几乎零侵入。


http://www.ppmy.cn/news/1458829.html

相关文章

面试中算法(使用栈实现队列)

使用栈来模拟一个队列,要求实现队列的两个基本操作:入队、出队。 栈的特点:先入后出,出入元素都是在同一端(栈顶)。 队列的特点:先入先出,出入元素是在两端(队头和队尾)。 分析&…

hbase建表预分区的2种方法

以下案例建表并设置预分区,分别测试以下2种方法 1.固定散列 示例:rowkey以日期为前缀 create ‘test’,‘cf1’, SPLITS > [‘202401’, ‘202402’, ‘202403’] put ‘test’,‘20240101’,‘cf1:name’,‘20240101’ put ‘test’,‘20240102’,‘cf1:name’,‘2024010…

neo4j-5.11.0安装APOC插件or配置允许使用过程的权限

在已经安装好neo4j和jdk的情况下安装apoc组件,之前使用neo4j-community-4.4.30,可以找到配置apoc-4.4.0.22-all.jar,但是高版本neo4j对应没有apoc-X.X.X-all.jar。解决如下所示: 1.安装好JDK与neo4j 已经安装对应版本的JDK 17.0…

linux高性能服务器--Ngix内存池简单实现

文章目录 内存模型:流程图内存对齐code 内存模型: 流程图 内存对齐 对齐计算 要分配一个以指定大小对齐的内存,可以使用如下公式: 假设要分配大小为n,对齐方式为x,那么 size(n(x-1)) & (~(x-1))。 举个…

基于springboot+mybatis+vue的项目实战之增删改查CRUD

目录结构 PeotController.java package com.example.controller;import com.example.pojo.Peot; import com.example.pojo.Result; import com.example.service.PeotService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web…

网工内推 | 技术支持工程师,最高15k,加班有补贴

01 星网信通 招聘岗位:售前技术支持 职责描述: 1、售前技术支持:技术交流、产品选型报价、方案制作等工作; 2、招投标支持:项目招标参数撰写、标书质疑、应标文件技术部分撰写及资质文件归纳准备、现场讲标及技术澄清…

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…

Filter 和 HandlerInterceptor 的执行顺序

Filter 和 HandlerInterceptor 的执行顺序 在 Spring 框架中,Filter 和 HandlerInterceptor 的执行顺序如下: Filter(过滤器): Filter 是 Java Servlet 规范中定义的组件,用于在请求进入 Servlet 之前或响应…