Redis 双写一致性

问题:redis 作为缓存,mysql 的数据如何与 redis 进行同步呢?(双写一致性)

双写一致性是指当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。

  • 读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间。
  • 写操作:延迟双删

什么是延迟双删?

  1. 先删除缓存,还是先修改数据库?

无论怎么操作都会存在数据不一致的问题。

  1. 为什么要删除缓存呢?

先删除缓存再删除数据库肯定是存在脏数据的,所以要删除两次缓存。

  1. 为什么要延时双删?

因为数据库是主从分离的,主从同步需要时间,所以需要延时删除。但是因为延时的时间不好控制,所以延时的过程中也可能出现脏数据

到底怎么才能保证数据的强一致性呢?

通过加锁的方式,但是性能比较低。
如何优化呢?
首先,存入缓存的数据一般都是读多写少,所以我们可以用读写锁控制。
共享锁:读锁 readLock,加锁之后,其他线程可以共享读操作。
排他锁:独占锁 writeLock 也叫,加锁之后,阻塞其他线程读写操作。
所以我们在读操作的时候可以加共享锁,其他线程就可以读,但是不可以写。

public item getById(Integer id){RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("ITEM_READ_WRITE_LOCK");// 读之前加读锁,读锁的作用就是等待该lockkey释放写锁以后再读RLock readLock = readWriteLock.readLock();try{// 开锁readLock.lock();System.out.println("readLock");Item item =(Item) redisTemplate.opsForValue().get("item:"+id);if(item != null){return item;}// 查询业务数据item = new Item(id,"华为手机","华为手机",5299.00);// 写入缓存redisTemplate.opsForValue().set("item:"+id,item);// 返回数据return item;}finally{readLock.unlock();}
}

在写操作的时候,加排他锁,其他线程都不能读写操作。

public void updateById(Integer id){RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("ITEM_READ_WRITE_LOCK");// 写之前加写锁,写锁加锁成功,读锁只能等待RLock writeLock = readWriteLock.writeLock();try{// 开锁writeLock.lock();System.out.println("writeLock");// 更新业务数据Item item = new Item(id,"华为手机","华为手机",5322.00);try{Thread.sleep(10000);}catch(InterruptedEXception e){e.printStackTrace();}// 删除缓存redisTemplate.delete("item:"+id);}finally{writeLock.unlock();}
}

使用读写锁肯定可以保证数据的强一致性,但是性能肯定低。所以需要保证数据强一致性的业务场景才会使用。

允许短暂的不一致性

  1. 异步通知保证数据的最终一致性

  1. 基于 Canal 的异步通知

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙内核框架

1 内核概述 内核简介 用户最常见到并与之交互的操作系统界面,其实只是操作系统最外面的一层。操作系统最重要的任务,包括管理硬件设备,分配系统资源等,我们称之为操作系统内在最重要的核心功能。而实现这些核心功能的操作系统模…

【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

大型装备制造企业案例分享——通过CRM系统管理全球业务

本期,小Z为大家带来的CRM管理系统客户案例是某大型装备制造企业运用Zoho CRM管理全球业务的过程分享。该企业是创业板上市公司,业务遍及100多个国家和地区,合作伙伴超百位,拥有覆盖全球的销售和服务网络。截止目前,相继…

vue3+echarts:Vue中使用echarts从后端获取数据并赋值显示

//由于前后端交互,所以使用axios发送请求 const Count ref(null); //设备种类数值 const Name ref(null); //设备种类名称 //设备种类 饼图 const pieChart () > {const getpieChart echarts.init(document.getElementById("deviceKind"));// 创建图标getpieC…

C语言——联合体类型

📝前言: 在前面两篇文章:C语言——结构体类型(一)和C语言——结构体(二)中,我们讲述了C语言中重要的数据类型之一:结构体类型,今天我们来介绍一下C语言中的另…

opencv0014 索贝尔(sobel)算子

前面学习的滤波器主要是用来模糊图像,今天一起来了解关于边缘识别的滤波吧!嘿嘿 边缘 边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要的作用。 人眼如…

Webstorm安装了vue脚手架后终端输入vue报错解决方法

当我们初学Vue的时候,刚安装完Vue脚手架之后,输入vue报错,是因为webstorm终端受限制了。 vue: 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。 解决方案如下: 通过…

C#,纽曼-尚克斯-威廉士素数(Newman Shanks Williams prime)的算法与源代码

1 NSW素数 素数是纽曼-尚克斯-威廉士素数(Newman-Shanks-Williams prime,简写为NSW素数)当且仅当它能写成以下的形式: 1981年M. Newman、D. Shanks和H. C. Williams在研究有限集合时,率先描述了NSW素数。 首几个NSW素…

【宝藏系列】嵌入式入门概念大全

【宝藏系列】嵌入式入门概念大全 0️⃣1️⃣操作系统(Operating System,OS) 是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输…

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动

Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动 在用Allegro进行PCB设计时,有时候需要同时移动某个区域的所有元素,如:Symbols,shapes,vias,Clines,Cline segs等元素。那么如何操作呢? 首先就是把Symbols,shapes,vias,Clines,Cline …

跑马灯(极简版)

主要参数 behavior:设定滚动的方式 alternate: 表示在两端之间来回滚动。scroll: 表示由一端滚动到另一端,会重复。slide: 表示由一端滚动到另一端,不会重复。 direction:设定活动字幕的滚动…

使用 Python、Elasticsearch 和 Kibana 分析波士顿凯尔特人队

作者:来自 Jessica Garson 大约一年前,我经历了一段压力很大的时期,最后参加了一场篮球比赛。 在整个过程中,我可以以一种我以前无法做到的方式断开连接并找到焦点。 我加入的第一支球队是波士顿凯尔特人队。 波士顿凯尔特人队是…