Redis-事务、锁

news2024/11/7 21:17:07

文章目录

  • 数据库的事务、锁介绍
      • 数据库的锁
      • 数据库的事务
  • Redis的事务介绍
  • Redis的事务操作例子
  • Redis的锁介绍
    • 1. 加锁
    • 2. 释放锁
    • 乐观锁和悲观锁
      • 悲观锁(Pessimistic Locking)
      • 乐观锁(Optimistic Locking)
      • Redis中的锁机制
    • 3. Redlock算法
    • 4. 实际应用场景
    • 5. 挑战和解决方案
  • Redis的锁的操作

数据库的事务、锁介绍

数据库中的锁和事务是两个重要的概念,它们都与数据的一致性、完整性和并发控制有关。下面我将详细解释它们之间的区别,并介绍Redis中的锁。

数据库的锁

数据库锁是数据库管理系统用来管理对数据库资源并发访问的一种机制。锁的主要目的是防止多个事务同时修改数据,从而避免数据不一致的问题。数据库锁可以分为以下几种:

  1. 排它锁(Exclusive Locks,简称X锁)

    • 当一个事务对数据对象加上排它锁时,它可以读取并修改该数据对象。其他事务则不能对这个已加排它锁的数据对象加任何锁,必须等待排它锁释放后才能访问该数据对象。
  2. 共享锁(Shared Locks,简称S锁)

    • 当一个事务对数据对象加上共享锁时,它可以读取但不能修改该数据对象。其他事务也可以对这个已加共享锁的数据对象加共享锁并读取它,但不能加排它锁。
  3. 更新锁(Update Locks,简称U锁)

    • 这是一种特殊类型的锁,用于处理可能会从读操作转变为写操作的情况。如果一个事务想要更新数据,它可以先加上更新锁。如果后续确实需要写操作,事务可以将更新锁升级为排它锁。

数据库的事务

数据库事务是一系列操作的集合,这些操作要么全部成功,要么全部失败。事务需要满足ACID属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability):

  1. 原子性

    • 事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。
  2. 一致性

    • 事务必须保证数据库从一个一致性状态转变到另一个一致性状态。
  3. 隔离性

    • 事务的执行不会被其他事务干扰,事务之间具有隔离性。
  4. 持久性

    • 一旦事务提交,则其所做的修改会永久保存在数据库中,即使系统发生故障也不会丢失。

Redis的事务介绍

"事务支持"是指Redis数据库提供了一种机制,允许用户将多个命令打包成一个事务执行。在Redis中,事务可以确保这些命令要么全部执行,要么全部不执行,从而保证了操作的原子性。 Redis的事务通过以下几个命令实现:

  • MULTI:开始一个事务,将后续的命令放入事务队列中。
  • EXEC:执行事务队列中的所有命令。
  • DISCARD:取消当前事务,清空事务队列。
  • WATCH:监控一个或多个键,如果在执行EXEC之前这些键被其他客户端修改,则事务会被取消。
  • UNWATCH:取消WATCH命令的监控

使用事务的好处包括:

  • 原子性:事务中的命令要么全部成功执行,要么全部不执行,不会有部分执行的情况。

  • 隔离性:Redis事务可以保证在执行过程中不会被其他客户端的命令插入,直到EXEC命令执行。

  • 一致性:事务确保数据从一个一致的状态转移到另一个一致的状态。

需要注意的是,Redis的事务不保证隔离性,因为Redis是一个基于内存的数据库,它在执行事务时不会对数据加锁。这意味着在事务执行期间,其他客户端仍然可以读取和写入数据,可能会导致所谓的“幻读”现象。因此,Redis的事务主要用于需要保证一系列操作原子性的场景,而不是用于需要严格隔离性的场景。

注意: Redis中开启一个事务时,不像MySQL中的好的回滚机制,Redis是会把所有命令放在一个队列中,这些命令并没有真正执行,提交事务才能执行,但是如果有命令是有报错的,那么就会清空所有的队列,所有的命令都不会执行
在这里插入图片描述

在这里插入图片描述

Redis的事务操作例子

在这里插入图片描述
在这里插入图片描述

Redis的锁介绍

Redis的锁通常是指使用Redis的数据结构实现的分布式锁:

  1. Redis锁的实现

    • 通常使用SETNX命令(SET if Not eXists)来设置一个键,如果该键不存在,则操作成功,可以认为获取了锁;如果键已存在,则操作失败,表示锁被其他进程或线程持有。
    • 为了使锁能够自动释放,通常会给锁设置一个过期时间,使用EXPIRE命令。
  2. Redis事务

    • Redis的事务是通过MULTIEXECWATCHUNWATCH命令实现的。MULTI开始一个事务,EXEC执行事务中的所有命令。如果事务中的任何命令失败,EXEC会返回错误,但不会回滚已经执行的命令。
    • Redis事务的隔离级别是比较低的,它不保证中间状态的隔离性,即其他客户端可能看到部分执行的结果。
  3. Redis锁与事务的区别

    • Redis锁主要用于在分布式系统中的不同进程或线程之间同步对共享资源的访问。
    • Redis事务主要用于保证一系列操作的原子性,即要么全部执行,要么全部不执行。

在这里插入图片描述


Redis的锁是通过Redis的数据结构和命令来实现的分布式锁。以下是Redis锁的基本使用方法和一些关键点:

1. 加锁

加锁通常使用SET命令,配合NX(Only set the key if it does not already exist)和PX(设置键的过期时间为毫秒数)选项来实现。这个命令尝试去设置一个键,如果键不存在,则设置成功并获得锁,同时设置一个过期时间以避免锁永久占用资源。命令格式如下:

SET lock_key unique_value NX PX expire_time
  • lock_key 是锁的名称。
  • unique_value 是一个唯一的值,通常是一个随机字符串,用于识别锁的持有者。
  • expire_time 是锁的过期时间,以毫秒为单位。

如果命令执行成功,返回OK,表示获得了锁;如果键已存在,返回nil,表示锁已被其他客户端持有。

2. 释放锁

释放锁需要确保只有锁的持有者才能释放锁,这通常通过Lua脚本来实现,以保证操作的原子性。Lua脚本如下:

if redis.call("GET", KEYS[1]) == ARGV[1] then
    return redis.call("DEL", KEYS[1])
else
    return 0
end

这个脚本检查锁的值是否与持有者的值匹配,如果匹配,则删除锁;否则,不执行任何操作。

乐观锁和悲观锁

悲观锁(Pessimistic Locking)

悲观锁是一种并发控制机制,它假设在任何时候,多个事务都可能尝试同时修改数据,因此必须对数据进行锁定以防止其他事务的修改。悲观锁通常在事务开始时就加锁,并在整个事务期间持有锁,直到事务结束时释放锁。

特点

  • 适合写操作多的场景。
  • 可以防止数据不一致性,但可能导致死锁和系统吞吐量降低。

乐观锁(Optimistic Locking)

乐观锁是一种宽松的并发控制机制,它假设多个事务不会同时修改相同的数据。乐观锁通常在事务提交时检查数据是否被其他事务修改过。如果数据未被修改,则提交事务;如果数据已被修改,则拒绝提交并重试。

特点

  • 适合读操作多的场景。
  • 减少了锁的争用,提高了系统的吞吐量,但在高并发写入时可能会增加事务的重试次数。

Redis中的锁机制

Redis是一个支持多种数据结构的内存数据库,它提供了事务和锁机制,但与传统关系型数据库的悲观锁和乐观锁有所不同。

  1. 乐观锁

    • Redis通过WATCH命令提供了乐观锁的支持。当执行事务时,可以使用WATCH监视一个或多个键。如果在WATCHEXEC之间,被监视的键被其他客户端修改了,事务会失败,客户端需要重新尝试事务。
  2. 悲观锁

    • Redis没有直接提供传统意义上的悲观锁。但是,通过SET命令的NX(Only set the key if it does not already exist)和PX(设置键的过期时间)选项,可以实现类似悲观锁的效果。这种方式通常用于实现分布式锁,确保在分布式系统中对共享资源的独占访问。
  3. 混合使用

    • 在某些情况下,Redis可以同时使用乐观锁和悲观锁的机制。例如,可以使用WATCH命令实现乐观锁,同时使用SET NX PX实现对特定资源的锁定。

总结来说,Redis主要使用乐观锁机制来处理事务中的并发冲突,但也可以通过特定的命令实现类似悲观锁的行为。在实际应用中,开发者可以根据业务需求和并发场景选择适合的锁机制。

3. Redlock算法

Redlock算法是Redis官方提出的一个分布式锁实现算法,它通过在多个独立的Redis实例上同时获取锁来提高锁的可靠性。算法的主要步骤包括:

  1. 客户端向多个Redis节点请求锁,并设置相同的键和值,并给定相同的超时时间。
  2. 请求每个节点的时间必须小于超时时间的一小部分,以确保获取锁的过程足够快。
  3. 客户端计算成功获取锁的节点数量,如果在多数节点上成功获取锁,则认为锁获取成功。
  4. 如果成功获取锁,客户端才能继续进行后续的操作;否则,需要在所有节点上释放已经获取到的锁。

4. 实际应用场景

Redis锁在实际应用中非常广泛,包括但不限于:

  • 电商系统的库存管理:确保同一时间内只有一个请求能够对商品库存进行扣减操作,避免超卖。
  • 分布式任务调度:确保某个任务在同一时间只被某一个节点执行。
  • 分布式限流:在高并发场景下,通过获取Redis锁来控制流量,保护系统免于过载。

5. 挑战和解决方案

  • 超时问题与自动续期:由于Redis锁需要设置过期时间,可能会出现客户端在锁未释放的情况下超时的问题。为了缓解这种情况,通常需要对锁进行自动续期。
  • 主从复制带来的不一致性:在Redis主从复制环境中,可能会出现锁在其他从节点上不可见的问题。使用Redis的哨兵模式或集群模式并结合Redlock算法可以部分缓解这些问题。
  • 锁的原子性:确保锁的获取和释放的原子性是非常重要的。使用Lua脚本可以确保多个Redis命令以原子方式执行。

通过上述方法和注意事项,可以在分布式系统中有效地使用Redis锁来协调对共享资源的访问。

Redis的锁的操作

在这里插入图片描述

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

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

相关文章

微服务基础拆分实践(第一篇)

目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者:SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 :以拆分商品模块为例 三、服务注册订阅与远程调用:以拆分购物车为例 3.1 …

【NOIP普及组】 过河卒

【NOIP普及组】 过河卒 💐The Begin💐点点关注,收藏不迷路💐 如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上…

功能强大视频编辑软件 Movavi Video Editor Plus 2024 v24.2.0 中文特别版

Movavi Video Editor Plus中文修改版是一款功能强大的视频制作编辑软件,使用能够帮助用户快速从录制的素材中制作成一个精美的电影,支持进行视频剪辑,支持添加背影、音乐和各种音乐,软件使用简单,无需任何的经验和专业…

linux基本指令之文件操作

前言 这次博客的主要目的就是要解决如何快速查看或查找文件,以及讲解文件的一些属性。本次博客还是以基本指令为主来理解linux对文件的操作。 linux下输入输出流的理解 在linux中,我们要对文件进行输入输出时,一般会怎么做呢? 可以通过pr…

JavaEE初阶---网络原理值TCP篇(三)

文章目录 1.延时应答机制2.捎带应答3.面向字节流---粘包问题3.1问题引入3.2解决方法 4.异常情况的处理5.TCP的心跳机制6.TCP/UDP的对比 1.延时应答机制 例如我们的这个剩余空间大小10kb,如果我们直接返回ack,这个发送方的窗口大小只能是10kb,但是如果我们进行延时&…

慢sql优化和Explain解析

要想程序跑的快,sql优化不可懈怠!今日来总结一下常用的慢sql的分析和优化的方法。 1、慢sql的执行分析: 大家都知道分析一个sql语句执行效率的方法是用explain关键词: 举例:sql:select * from test where bussiness_…

Java后端面试内容总结

先讲项目背景,再讲技术栈模块划分, 讲业务的时候可以先讲一般再特殊 为什么用这个,好处是什么,应用场景 Debug发现问题/日志发现问题. QPS TPS 项目单元测试,代码的变更覆盖率达到80%,项目的复用性高…

【10月】新款3DMAX插件排行榜

根据近期的行业动态和插件发布情况,整理并推荐一些在10月或近期内受到关注的3DMAX新款插件。 1. MaxToCAD插件 功能特点:允许用户将3D MAX中的三维模型快速转换为CAD软件可识别的二维平面图,适用于需要将3D设计导出为施工图或平面图的设计师…

【数据结构与算法】第7课—数据结构之队列

文章目录 1. 队列1.1 什么是队列1.2 队列的结构1.3 队列初始化1.4 队列入栈1.5 出队列1.6 查找队列有效元素个数1.7 取队头和队尾数据1.8 销毁链表 2. 用两个队列实现栈3. 用两个栈实现队列4. 循环队列 1. 队列 注:文中Queue是队列,Quene是错误写法 1.1 …

window快捷键:window + v 打开剪切板历史记录 / 非常实用

一、剪切板历史记录功能介绍 1.1、window v 打开剪切板历史记录 / 文字、图片都可记录 1.2、window v 最近使用 1.3、window v 表情符号 1.4、window v GIF 1.5、window v 颜文字 1.6、window v 符号 二、欢迎交流指正

手机功耗异常大数据看板建设

一、背景 基于《软件绿色联盟应用体验标准—功耗标准》监控软硬件资源功耗异常类别与趋势 上述为手机功耗问题的前世今生及我们应该在哪些维度建立功耗的埋点监控支持分析​ 二、目标 手机端侧建立alarm\wakelock\wakeup\gps\bt\cpu\sensor\netTriffic等功耗相关的使用次数和时…

多彩电子显示屏

在仓储管理的广阔舞台上,一款名为“仓库46代”的创新标签悄然登场,它不仅是技术的飞跃,更是智慧仓储的新篇章。这款标签,以其独特的515.6x260x29mm身材,优雅地融入了繁忙的仓库环境,其沉稳的黑色外观&#…

sklearn|机器学习:决策树(一)

文章目录 sklearn|机器学习:决策树(一)(一)概述(二)实战1. 环境配置2. sklearn 中的决策树(1)模块 sklearn.tree(2)sklearn 基本建模流…

服务器Linux系统网络重启失败 Restarting network (via systemctl):......

网络重启时报错: Linux 网络服务重启失败可能由网络配置工具冲突或配置错误引起。 冲突问题:在 Linux 中,network 和 NetworkManager 这两个工具可能会冲突,禁用 NetworkManager 可以尝试解决该问题。 先停止服务 systemctl s…

域控操作二十四:主域故障辅域接替

模拟环境:上海DC1故障无法开机,导致只有一个DNS的电脑无法上网(实际可以添加DC2但是为了实验就不说了) FSMO还在DC1上 使用powershell把角色迁移到DC2 ntdsutil roles connections connect to server DC2SHA.whbk.cn quitSeize …

边缘AI计算技术应用-实训解决方案

一、解决方案架构 1.1 来自产业的项目 实训项目全部是基于产业的商业化项目,经过角色拆解、任务拆解、代码拆解、部署流程拆解等过程,讲其标准化为教师可以带领学生完成的实训内容,真正帮助学生接触产业前沿技术和工作内容,提升就…

贪心算法习题其二【力扣】【算法学习day.18】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…

【Axure原型分享】颜色选择器——填充颜色

今天和大家分享颜色选择器——填充颜色的原型模板,点击颜色区域可以弹出颜色选择器,点击可以选择对应颜色,颜色区域会变色我们选择的颜色,具体效果可以观看下方视频或者打开预览地址体验。 【原型效果】 【Axure高保真原型】颜色…

SQL实战训练之,力扣:1843. 可疑银行账户

目录 一、力扣原题链接 二、题目描述 三、建表语句 四、题目分析 五、SQL解答 六、最终答案 七、验证 八、知识点 一、力扣原题链接 1843. 可疑银行账户 二、题目描述 表: Accounts ---------------------- | Column Name | Type | ---------------------- | acco…

软件系统交付阶段必备文档,验收体系配套资料,软件系统各阶段各步骤相关配套资料,各类软件建设方案(word,ppt)

软件文档交付清单是指在软件开发项目完成后,开发团队需要准备的一份详细清单,用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件资料清单列表部分文档清单:工作安排任务书&…