Redis一致性与分布式锁

news2024/9/23 2:36:36

Redis一致性

何为redis一致性

即在项目中,redis缓存中的数据要与数据库当中的数据保持一致。

那么这里,就会有小伙伴要问了,redis缓存中的数据不就是从数据库当中查询出来的吗?怎么会不一致呢?

笔者在这里解答一下这个问题嘿嘿,在简单项目中,redis一致性确实不用太过考虑,可是在高并发的项目中,就必须考虑redis的一致性了,举个很简单的例子,比如某平台发起了一个1元抢iphone15的活动,总共只有一台,但却又数万人守在电脑面前跃跃欲试。我们来设想一下,假如成功抢到的那个用户,点击抢购按钮后,是不是redis缓存中的手机数量就给删除了,就没得抢了嘛,然后后台数据库也要进行更新,将可以秒杀的手机数量变为0是不是?

但我们在现实开发过程中,必须要考虑一个很现实的问题:网络波动

我们假设在第一个用户点下抢购按钮,也的确将redis缓存中的秒杀手机这一数据给删除了,但是在将redis的数据更新到数据库这一过程中,产生了网络波动,导致更新操作一直未完成。就在这个网络波动的时间段内,又有一个用户点击了抢购按钮,此时他的请求发到服务器后,服务器发现redis缓存没有秒杀手机数量的数据,于是便会去查询数据库,但此时数据库中的数据并未更新,可供秒杀的手机数量仍然为1,便将这个数据返回给redis,并且这个用户也会显示抢购成功。虽然后面网络波动结束,数据库成功更新了,不会再有任何用户秒杀到手机,但明明只有一台的名额,却有两个用户秒杀到了,这个明显是有问题的,这也就是redis一致性要解决的。

为什么会有redis一致性

在微服务分布式项目中,可能存在数据库更新了,但redis未更新,从而使得客户端所得到的数据(客户端数据从redis缓存当中获取),与后台实际数据库当中的数据不一致的问题。即当高并发的情况下,存在多个用户同时发起一个请求,都需要查询redis中的数据。

上述也有举例,大家可以结合起来理解。

双删一致性

现在我们再假设一个业务场景:

图灵解读:现在有两个线程,分别为线程1和线程2,首先线程1对redis缓存中的数据进行删除,并对数据库进行对应的更新,但由于网络延迟,数据库并未及时更新;与此同时,在网络延迟的时间中,线程2想从redis中查询数据,但由于线程1删除了redis缓存中的数据,所以便会向数据库直接查询,但由于网络延迟,线程1发起的数据库更新操作还未实现,故此时线程2通过redis从数据库中查询到的数据为旧数据,并此旧数据还会存储在redis中,当线程1更新数据库的操作完成之后,此时redis缓存中的数据便与数据库中的数据完全不一致了,并当后续更多线程来查询数据时,也都是会从redis中查询到旧数据

解决方案(双删一致性流程):

即在上述的业务的场景中,我们在线程一对数据的更新操作完成了之后,将当前redis缓存中的数据进行一个删除,这样后续的查询请求便会直接查询数据库当中的最新数据,并将最新的数据存入redis缓存中;因为一共删除了两次数据,即线程1删除了一次,并且线程1对数据库的更新操作执行完成之后,又删除了一次redis,故叫做双删一致性

双删一致性注意点:

在第二次删除的时候,我们需要延迟几百毫秒再进行删除。原因:避免因为线程2将数据库中的老数据放入到redis这一过程产生延迟,导致线程1的第二次删除redis缓存这一操作发生在线程2将老数据放入redis之前,导致redis中仍旧保存的是数据库中到的老数据

双写一致性

流程:

先操作数据库,再删除redis;即数据库中的数据发生了更新后,redis缓存中的数据也要进行一致的更新

如何实现:

方案:如果对实际业务的影响不大,则不管;如果对实际业务有较大影响,则可通过双删来处理

分布式锁

定义

单体项目实现分布式锁:在单进程(启动一个jvm)的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。而同步的本质是通过锁来实现的;即多个线程共用一把锁,锁只能被一个线程使用,其余线程只能排队等待使用。

基于数据库操作

乐观锁

定义

乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做

如何使用

表中添加一个时间戳或者版本号的字段来实现,update account set version = version + 1 where id = #{id} and version = #{oldVersion} 当更新不成功,客户端重试,重新读取最新的版本号或时间戳,再次尝试更新,类似 CAS 机制,推荐使用。

悲观锁

定义

假设在并发的情况下,数据处理很容易发生冲突。为了保证数据的一致性和完整性,故每次在读写数据的时候都会先加锁

如何使用

适合于写比较多的操作,先加上锁保证数据的完整和一致性,其余进程等待即可,通过悲观锁锁上,业务需求的强一致性较高,则可以通过悲观锁先锁上,然后一个进程一个进程的进行数据的操作

基于redis缓存与过期时间

redisson执行流程

图文解读

多个线程竞争一个锁,最终只能有一个线程获取到这个锁。通过uuid与线程id作为加锁的key,保证当前锁与当前线程的正确绑定,在线程进行业务处理的时候,内部会有一个watch dog,也就是常说的看门狗机制,它会每隔10s去看一下该线程是否还持有锁,如果还持有的话,则延迟生存时间,给锁进行续命,如果redis进行了集群的话,还会通过lua脚本来进行redis的选择;如果没有获取锁,则会进行自旋,直到成功获取锁 

面试重点题

当redis使用集群时,如果主节点master挂了,如何保持数据的一致性?

答:通过redisson提供的red lock来进行解决,red lock功能:针对redis中的所有节点进行同步,所有节点同步成功后,才会返回锁存储成功,从而达成强一致性。

基于zookeeper临时节点与watch

公平锁

非公平锁

根据Zookeeper的临时节点的特性实现分布式锁,先执行的线程在zookeeper创建一个临时节点,代表获取到锁,后执行的线程需要等待,直到临时节点被删除说明锁被释放,第二个线程可以尝试获取锁。

写在最后:

本篇文章给大家介绍了些redis一致性的知识点,希望能够给大家带来帮助。笔者小,中,大厂均有面试经验,目前正在从事全栈开发工作,坚持每日分享java全栈开发知识与相关的面试真题,希望能够给大家带来帮助,同大家共同进步。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字信号||离散系统的冲激响应和阶跃响应(3)

实验三 离散系统的冲激响应和阶跃响应 一、实验目的 (1)加深对离散线性移不变(LSI)系统基本理论的理解,明确差分方程与系统函数之间的关系。 (2)初步了解用MATLAB语言进行离散时间系统研究的基本方法。 (3)掌握求解离散时间系统冲激响应和阶跃响应程序的编写方…

Proxmox8基于PC物理机/服务器安装,初始化,挂载磁盘,安装虚拟机

目录 安装文件 开始安装Proxmox 选择启动菜单,F11 后进入启动菜单选择 按需选择是否关闭RAID 选择对应的U盘 进入安装界面 进入安装启动过程 选择系统盘 设置相关信息 设置IP和开启root远程登录 设置dns 设置网卡ip 设置 ssh 远程登录 开机合并local-l…

Java---String类

乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 前言 在C语言中已经涉及到字符串了…

四、GD32 MCU 常见外设介绍 (6) ADC 模块介绍

6.1.ADC 基础知识 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于外部输入通道、内部输入通道的模拟信号,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。 6.2.GD…

go语言Gin框架的学习路线(十)

目录 GORM的CRUD教程 查询 普通查询 定义 User 结构体 查询所有用户 查询第一个用户 总结 条件查询 内联条件 额外查询选项 高级查询 链式操作 Scopes 多个立即执行方法 GORM的CRUD教程 CRUD 是 "Create, Read, Update, Delete"(创建、查询…

数字图像处理中的常用特殊矩阵及MATLAB应用

一、前言 Matlab的名称来源于“矩阵实验室(Matrix Laboratory)”,其对矩阵的操作具有先天性的优势(特别是相对于C语言的数组来说)。在数字图像处理中,为了提高编程效率,我们可以使用多种方式来创…

【UIE模型-傻瓜式教程】飞桨AI Studio中fork实体抽取任务(打车、快递单)并运行教程

文章目录 fork项目环境与数据准备微调训练验证与测试 fork项目 环境与数据准备 安装paddlenlp(尽量装paddlenlp2.4.2,否则会报错!) 下载打车数据 转换数据格式,并划分训练集、验证集和测试集 微调训练 微调训练&#x…

WiFi通信——STM32通过ESP8266-01S与阿里云通信

嵌入式设计中常用的无线通信方式主要由蓝牙、WiFi、Zigbee、Lora、NB-IOT等等。这些是最常用的,也是在实际项目开发中根据项目的数据通信特点来选择相应的无线通信方式。本设计主要是讲解WiFi在嵌入式开发中的使用。 1. ESP8266-01S烧录固件 WiFi通信的频段和蓝牙一…

论文中的流程图参考图片

写论文的时候,在绘制流程图时,一直纠结n是大写还是小写,用不用斜体,号两边要不要空格。今天找到了一张标准的流程图来参考。图片来自 Zhi-Chang Ba et al, Combination of DCE-MRI and NME-DWI via Deep Neural Network for Predi…

学成在线开心学习

环境配置 第一章 项目介绍&环境搭建 项目背景 项目业务框架 项目技术架构 第二章 内容管理模块 本项目使用mybatis-plus的generator工程生成PO类、Mapper接口、Mapper的xml文件 模块工程 模型类的作用 课程查询接口 controller ApiOperation("课程查询接口&qu…

数字化就是要“用数字说话”运营,按“效果付费”经营

随着数字化技术的迅速发展,企业所处的市场环境发生了深刻的变革。在这个数字化转型时期,数据成为了企业决策的关键依据,“用数字说话”已成为企业运营的基本准则。而“效果付费”作为一种基于实际成果的商业模式,正逐渐受到企业经…

【QAC】Dashboard服务端如何配置

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决Dashboard服务端如何配置的问题。 2、 问题场景 客户想使用Dashboard,Dashboard服务端如何配置。 3、软硬件环境 1、软件版本:HelixQAC23.04 2、机器环境:Windows 64bit 3…

Linux_权限3

Linux所对应的文件类型 1.在Win下,有文件类型,通常通过后缀标识 日常用的就是windows系统这里不做举例. 2.Linux的文件类型不通过后缀区分(不代表Linux不用后缀) 其中需要注意的是第一个字符表示文件类型的含义 - :普通文件, 文本, 源代码…

AtCoder Beginner Contest 363(A~D题)

A - Piling Up 思路: 我们只需要找到下一阶段的下限。a / 100 是本阶段1 变成下一阶段&#xff0c;再 * 100变成下限&#xff0c;再与原来的相减即可。 代码: #include<bits/stdc.h> using namespace std; #define N 200010 typedef long long ll; typedef unsigned l…

Biomimetics 综述分享:肌电假肢手的交互操作控制综述

近些年假肢灵巧手成为了热点研究方向。此前有综述研究回顾了包括基于表面肌电信号的预测连续上肢运动的方法、基于表面肌电信号的多任务人机交互应用&#xff0c;以及肌电控制中的各种性能指标。近期&#xff0c;期刊Biomimetics&#xff08;JCR Q1&#xff09;发表了“面向肌电…

定时器+外部中断实现NEC红外线协议解码

一、前言 1.1 功能介绍 随着科技的进步和人们生活水平的提高&#xff0c;红外遥控器已经成为了日常生活中不可或缺的电子设备之一&#xff0c;广泛应用于电视、空调、音响等多种家电产品中。 传统的红外遥控器通常只能实现预设的有限功能&#xff0c;无法满足用户对设备更加智…

Mac 下华为鸿蒙 :DevEco Studio 开发工具下载

1.登录&#xff1a;华为开发者中心--开发--下载工具DevEco Studio 2.下载完成后 &#xff0c;安装&#xff0c;并创建一个新项目。 3.Tools --点击SDK Manager 下载SDK: 如果报&#xff1a;淘宝镜像源错误&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_H…

Threejs——辅助视图的旋转轴

官网的代码&#xff1a;link 实现这个效果 import {CylinderGeometry,CanvasTexture,Color,Euler,Mesh,MeshBasicMaterial,Object3D,OrthographicCamera,Quaternion,Raycaster,Sprite,SpriteMaterial,SRGBColorSpace,Vector2,Vector3,Vector4 } from three;class ViewHelper …

FP5207+音频功率放大器的组合解决方案-适用于便携式音频播放器、无线耳机、智能音箱和车载音响系统等高质量音频输出需求的产品,以提高电池供电的效率和输出功率

随着消费者对智能家居的需求增长&#xff0c;智能音响市场成为重要增长点。同时&#xff0c;音响技术也在不断发展&#xff0c;音响及扬声器的功能和性能不断提升。 蓝牙音箱&#xff0c;这类音箱供电是以锂电池为主&#xff0c;一般选用内置升压的音频功放芯片&#xff0c;音响…

Java聚合快递系统对接云洋系统快递小程序系统源码

&#x1f680; "聚合快递系统"无缝对接云洋系统&#xff0c;快递小程序新体验&#xff01;&#x1f4e6; &#x1f69a; 开篇&#xff1a;快递管理新纪元&#xff0c;一键接入云洋系统&#xff01; 你是否还在为繁琐的快递管理而头疼&#xff1f;多个快递公司账号切…