返回顶部
首页 > 资讯 > 前端开发 > html >Redis缓存中的事务处理讲解
  • 181
分享到

Redis缓存中的事务处理讲解

2024-04-02 19:04:59 181人浏览 薄情痞子
摘要

这篇文章主要介绍“Redis缓存中的事务处理讲解”,在日常操作中,相信很多人在Redis缓存中的事务处理讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis缓存中的事

这篇文章主要介绍“Redis缓存中的事务处理讲解”,在日常操作中,相信很多人在Redis缓存中的事务处理讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis缓存中的事务处理讲解”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

从数据库事务说起

 通常我们提及数据库都不可避免的要提到事务,那么什么是事务呢?事务是指作为单个逻辑工作单元执行的一系列操作。所以,首先事务是一系列操作,这一系列操作具有二态性,即完全地执行或者完全地不执行。因此事务处理可以确保除非事务单元内的所有操作的成功完成,否则不会***更新面向数据的资源。我们这里举一个例子,数据库中除查询操作以外,插入(Insert)、删除(Delete)和更新(Update)这三种操作都会对数据造成影响,因为事务处理能够保证一系列操作可以完全地执行或者完全不执行,因此在一个事务被提交以后,该事务中的任何一条sql语句在被执行的时候,都会生成一条撤销日志(Undo  Log),而撤销日志中记录的是和当前擦作完全相反的操作,比如删除的相反操作是插入,插入的相反操作是删除等。我们通常所说的事务回滚其实就是去执行这些插销日志里的相反操作,这同样告诉我们一个道理,只有事务中的一系列操作完全执行的情况下可以回滚,如果是在意外情况下导致事务中的一系列操作没有完全执行,这个时候我们是不能保证数据一定可以回滚的。

 在数据库相关理论中,一个逻辑工作单元想要成为事务,就必须满足ACID,即原子性、一致性、隔离性和持久性。(1):原子性这个概念其实就是指,一个事务内的所有SQL操作都是一个整体,因此只有所有的SQL操作都完全执行成功,该事务方可以认为提交成功。如果在提交事务过程中某一条SQL语句执行失败,则整个事务必须回滚到事务提交前的状态。(2):而一致性这个概念则是指,事务在完成的时候,必须要保证所有的数据都保持一致的状态,而落实到数据库的各个组成部分上,则要求开发人员能够保证数据、索引、约束、日志等在事务前后具备一致性。(3):隔离性这个概念主要针对并发,其核心思想就是不同的并发事务对数据产生的修改必须是相互隔离的,假设有两个不同的事务A和B并发执行,那么对A来讲,它在执行前的状态只有两种,即B执行前和B执行后。同理,对B来讲同样是如此,这样的特性我们就称为隔离性。(4):持久性相对简单,是指事务完成以后它对数据的影响是***性的。

Redis中的事务处理

 好了,截止到目前为止,我们对数据库中事务处理的相关理论有了一个基本的认识,或许这个世界上的数据库系统千差万别,但我相信在事务处理这个问题上它们最终会殊途同归,就像我们解决并发过程中的冲突问题,常规的做法依然是加一样,这是我之所以要花费精力去理解和解释这些理论知识的原因,技术可谓是日新月异,如果我们总是一味地为新技术而疲于奔命,那么或许我们会渐渐地失去对这个行业的热爱,我相信原理永远比框架更为重要,没有系统学习过计算机专业的课程,这件事情让我至今都颇为遗憾。Redis中的事务是可以视为一个队列,即我们可以通过MULTI开始一个事务,这相当于我们声明了一个命令队列。接下来,我们向Redis中提交的每条命令,都会被排入这个命令队列。当我们输入EXEC命令时,将触发当前事务,这相当于我们从命令队列中取出命令并执行,所以Redis中一个事务从开始到执行会经历  开始事务 、 命令入队 和 执行事务 三个阶段。下面是一个在Redis中使用事务的简单示例:

127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET Book_Name "git Pro" QUEUED 127.0.0.1:6379> SADD Program_Language "c++" "C#" "Jave" "python"  QUEUED 127.0.0.1:6379> GET Book_Name QUEUED 127.0.0.1:6379> EXEC 1) OK 2) (integer) 4 3) "GIt Pro"

我们可以注意到Redis中的事务和通常意义上的事务基本上是一致的,即

  • 事务是由一系列操作组成的单个逻辑工作执行单元。特别地,因为在Redis中命令是存储在一个队列中,所以,事务中的所有命令都会按顺序执行,并且在执行事务的过程中不会被客户端发送的其它命令中断。

  • 事务是一个原子操作,事物中的命令只有两种执行结果,即全部执行或者全部不执行。如果客户端在使用MULTI命令开启事务后因为意外而没有执行EXEC命令,则事务中的所有命令都不会执行。同理,如果客户端在使用MULTI命令开启事务后执行EXEC命令,则事务中的所有命令都会执行。

  • Redis中的事务可以使用DISCARD命令来清空一个命令队列,并放弃对事务的执行。如果命令在入队时发生错误,Redis将在客户端调用EXEC命令时拒绝执行并取消事务,但是在EXEC命令执行后发生的错误,Redis将选择自动忽略。

我们知道,常见的并发控制方案主要有悲观锁和乐观锁两种方案,这里首先来解释下这两种概念。所谓悲观锁,顾名思义是一种悲观的策略,悲观锁认为:在对任何记录做修改前都应该加锁,如果加锁失败则表明该机录正在被修改,此时应该抛出异常;如果加锁成功则修改记录并在事务完成后解锁;如果有其它人修改则应该等待当前修改解锁或者是抛出异常。而所谓乐观锁,顾名思义是一种乐观的策略,乐观锁认为:每次从记录中查找数据别人都不会修改,因此这个过程中不需要加锁,但是在更新记录的时候,会通过版本号来判断别人是否修改过当前记录。

通常来讲,乐观锁适合在写冲突相对较少的场合下,悲观锁适合在写冲突相对较多的场合下。Redis中提供了一种称为check-and-set的机制,该机制主要通过WATCH命令来实现,其原理正是基于乐观锁的策略,Redis会在执行EXEC命令前检查被监视的键对应的值是否发生变化,如果该值发生变化表明有人修改过这个键中存储的值,此时Redis将会自动取消当前事务。我们来看这个简单的例子:

WATCH Record_Count val = GET Record_Count val = val + 1 MULTI SET Record_Count $val EXEC

在这个例子中,我们尝试在事务中对Record_Count做一个自增操作,这段代码在非并发的情况下是没有问题的,可是在并发的情况下,如果在执行EXEC命令前有一个用户修改了Record_Count的值,那么我们此时的结果就会比期望的结果小1,现在我们有了WATCH,Redis就会对Record_Count进行监听,当Redis监听到该值发生变化的时候,这个事务就会被自动取消,进而避免造成冲突。

如何管理Redis的键

 其实从切题的角度来讲,这篇博客基本上说清楚了事务处理问题,因此这篇博客虽然没有给大家带来多少惊喜,却依然可以非常恰到好处的结题,可是因为之前有朋友在博客中留言并问到Redis的键管理的问题,所以博主决定在这里简单的讨论下这个问题,鉴于博主和大家一样都是感刚接触Redis,所以下面的观点仅仅是一家之言,如果有疑问可以在博客中留言,欢迎大家批评指正。我认为Redis中的键的管理,基本上有两种策略,即惰性删除和定期删除,而实际上这正是Redis默认的键删除策略:

redis使用 惰性删除 和 定期删除  两种策略来删除过期的键:惰性删除策略在碰到过期键时方进行删除操作,定期删除策略则每隔一段时间主动查找并删除过期键。

所以,基于这两种键删除策略,我们可以想到的做法有:

  • 对于临时变量可以采用临时键来存储,在数据库全局设定一个过期时间,由Redis在键过期后自动删除。

  • 对于持久化数据可以采用普通键来存储,通过服务器和客户端间定义协议来由客户端主动删除键。

  • 对于不同模块中的键采取统一规范的命名规则来命名键,从而解决Redis中键管理混乱的问题。

设计合理的键回收机制,避免Redis使用超过95%以上的内存,或者通过设置Redis中的***内存容量及其内存策略来主动触发Redis对键的淘汰。

到此,关于“Redis缓存中的事务处理讲解”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Redis缓存中的事务处理讲解

本文链接: https://lsjlt.com/news/79725.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Redis缓存中的事务处理讲解
    这篇文章主要介绍“Redis缓存中的事务处理讲解”,在日常操作中,相信很多人在Redis缓存中的事务处理讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis缓存中的事...
    99+
    2024-04-02
  • Redis的事务处理详细讲解
    本篇内容主要讲解“Redis的事务处理详细讲解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis的事务处理详细讲解”吧! 事务...
    99+
    2024-04-02
  • Redis缓存实例超详细讲解
    目录1 前言1.1 什么是缓存1.2 缓存的作用及成本1.3 Redis缓存模型2 给商户信息添加缓存3 缓存更新策略3.1 更新策略介绍3.2 主动更新策略3.3 主动更新策略练习4 缓存穿透及其解决方案4.1 缓存穿...
    99+
    2022-12-07
    Redis缓存策略 Redis缓存机制 Redis缓存
  • Redis缓存策略超详细讲解
    目录Redis缓存中间件缓存是什么缓存的优点缓存的缺点Redis缓存已查询数据redis缓存中间件实践缓存更新缓存更新的三个策略主动更新策略的三种方案主动更新的代码实现Redis缓存...
    99+
    2024-04-02
  • redis 分布式缓存实战-redis 事务
    redis 分布式缓存实战-redis 事务   1.描述    redis 事务单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送过来的命令请求所打断。   redis 事务没有隔离级...
    99+
    2017-03-11
    redis 分布式缓存实战-redis 事务
  • Redis入门(3) - 事务和缓存
    事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。 事务的使用方式 > MULTI OK > SADD key1 1 QUEUED > SADD key2 2 QUEUED > EXEC 1) (int...
    99+
    2020-11-05
    Redis入门(3) - 事务和缓存
  • Redis中缓存过期、内存被缓存占用要如何处理
    这篇文章主要讲解了“Redis中缓存过期、内存被缓存占用要如何处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis中缓存过期、内存被缓存占用要如何处...
    99+
    2024-04-02
  • redis缓存挂了怎么处理
    redis缓存故障处理步骤:确定故障原因,检查日志和系统状态。采取临时措施,切换备用服务器、禁用缓存或使用其他解决方案。修复故障,调整配置、更新软件或调整资源。恢复缓存,重启服务器或切换...
    99+
    2024-05-21
    redis 数据丢失
  • windows环境下Redis+Spring缓存实例讲解
    一、Redis了解 1.1、Redis介绍: redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(...
    99+
    2022-06-04
    缓存 实例 环境
  • Redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性怎么理解
    这篇文章主要介绍“Redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性怎么理解”,在日常操作中,相信很多人在Redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性怎么理解问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
  • PHP缓存函数精讲:file_get_contents、file_put_contents、unlink等函数的缓存处理方法
    PHP缓存函数精讲:file_get_contents、file_put_contents、unlink等函数的缓存处理方法导语:在Web开发中,缓存是提高网站性能和用户体验的重要手段之一。PHP提供了一系列文件操作函数来实现缓存处理,其中...
    99+
    2023-11-18
    缓存 函数 PHP
  • redis缓存出现异常怎么处理
    redis缓存出现异常的解决方法:清除redis缓存,解决异常,操作步骤:访问redis根目录,命令:“cd /usr/local/redis-2.8.19”。登录redis,命令:“redis-cli -h 127.0.0.1 -p 63...
    99+
    2024-04-02
  • Redis缓存三大异常如何处理
    本文小编为大家详细介绍“Redis缓存三大异常如何处理”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis缓存三大异常如何处理”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、背景Redis是一个完全开源的...
    99+
    2023-07-02
  • linux中如何清理redis缓存
    清理Redis缓存可以通过以下几种方法: 使用Redis自带的命令:可以使用FLUSHDB命令清空当前数据库中的所有数据,或者使...
    99+
    2024-04-02
  • PHP8.0中的缓存库:Redis
    PHP作为一种流行的Web编程语言,已经被广泛采用于构建各种网站和应用程序。随着互联网的发展和用户量的增加,网站的访问量也越来越大,这就导致了数据库的大量访问和更新。这会使得PHP应用程序响应时间变慢,甚至出现瓶颈。为了解决这个问题,Red...
    99+
    2023-05-14
    PHP redis 缓存库
  • Redis中三大缓存现象缓存击穿、缓存穿透、缓存雪崩的解决方法
    这篇文章主要介绍“Redis中三大缓存现象缓存击穿、缓存穿透、缓存雪崩的解决方法”,在日常操作中,相信很多人在Redis中三大缓存现象缓存击穿、缓存穿透、缓存雪崩的解决方法问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
  • redis事务如何处理
    redis 事务处理 Redis 事务是一种命令分组,这些命令要么全部执行,要么全部不执行。它确保原子性、一致性、隔离性和持久性(ACID)属性,即使在并发情况下也是如此。 事务的运作方...
    99+
    2024-06-12
    redis
  • redis事务是怎么处理的
    redis 事务是一种将多个命令打包在一起的机制,要么全部执行,要么全部回滚,从而确保数据的完整性和一致性。开启事务通过 multi 命令,提交事务通过 exec 命令。事务队列化执行,...
    99+
    2024-05-21
    redis
  • mysql的查询缓存及innodb缓存回收机制讲解
    这篇文章主要讲解了“mysql的查询缓存及innodb缓存回收机制讲解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql的查询缓存及innodb缓存回...
    99+
    2024-04-02
  • Redis缓存三大异常的处理方案梳理总结
    目录前言一、背景二、缓存雪崩(一)是什么(二)为什么(三)怎么办三、缓存击穿(一)是什么(二)为什么(三)怎么办四、缓存穿透(一)是什么(二)为什么(三)怎么办五、其他(一)缓存预热(二)缓存降级六、总结前言 Redis...
    99+
    2022-06-23
    Redis缓存异常处理方案 Redis缓存异常
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作