返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一文教你学会Redis的事务
  • 236
分享到

一文教你学会Redis的事务

Redis 事务 2022-11-13 14:11:13 236人浏览 泡泡鱼
摘要

目录Redis 中的使用开始事务命令入队执行事务discard 命令watch 命令事务异常命令错误运行时异常事务的 ACID原子性一致性隔离性持久结语Redis 作为内存的存储中间

Redis 作为内存的存储中间件,已经是面试面试题必问之一了,今天一起来看看 Redis 的事务吧。

事务提供了一种"将多个命令打包,一次性提交并按顺序执行"的机制,提交后在事务执行中不会中断。只有在执行完所有命令后才会继续执行来自其他客户的消息。

Redis 中的使用

Redis 通过 multi,exec,discard,watch 实现事务功能。

  • multi:开始事务
  • exec:提交事务并执行
  • discard:取消事务
  • watch:事务开始之前监视任意数量的键
> multi
OK
> set bookName "Redis"
QUEUED
> get bookName
QUEUED
> sadd tag "Redis" "New Book"
QUEUED
> smembers tag
QUEUED
> exec
1) OK
2) "Redis"
3) (integer) 2
4) 1) "Redis"
   2) "New Book"

开始事务

> multi
OK

这个命令将 Redis_multi 选项打开,让客户端从非事务状态变为事务状态

命令入队

> set bookName "Redis"
QUEUED
> get bookName
QUEUED
> sadd tag "Redis" "New Book"
QUEUED
> smembers tag
QUEUED

在事务状态中,Redis 命令并不是立即执行的,而是进入一个先进先出的事务队列。QUEUED 表示这个命令已经入了事务队列。

执行事务

> exec
1) OK
2) "Redis"
3) (integer) 2
4) 1) "Redis"
   2) "New Book"

当执行 exec 命令时,Redis 根据客户端所保存的事务队列, 以先进先出的方式执行事务队列中的命令:最先入队的命令最先执行, 而最后入队的命令最后执行。当 exec 命令执行完毕时,Redis 会将结果保存到一个回复队列,并将回复队列返回给客户端。客户端从事务状态退出,一个事务执行完毕。

discard 命令

> multi
OK
> set author "lisi"
QUEUED
> discard
OK
> get author
(nil)

discard 取消一个事务的命令,表示这个事务被取消。客户端从事务状态退出,回到非事务状态,Redis_multi 选项关闭。

watch 命令

# Redis 客户端1
> watch letter
OK
> multi
OK
> set letter a
QUEUED
> exec
(nil)


# Redis 客户端2
> set letter b
OK

# Redis 客户端1
> get letter
"b"

设置监控 letter 键,客户端1进入事务,设置 letter 的 value 为 a,未提交事务。客户端2设置 letter 的 value 为 b。回到客户端1提交事务返回的结果为 nil,调用 get 命令得到 letter 为 b。这说明当 letter 键在其他客户端改变后,事务被取消了,不会被执行,返回失败。

watch 命令在事务开始之前监视任意数量的键:当调用 exce 命令执行事务时,如果任意一个被监视的键已经被其他客户端修改了,那么整个事务不再执行,直接返回失败。

事务异常

命令错误

> set letter ac
QUEUED
> get letter ac
(error) ERR wrong number of arguments for 'get' command
> exec
(error) EXECABORT Transaction discarded because of previous errors.

事务中命令异常属于语法错误,将导致事务无法执行。

运行时异常

> multi
OK
> lpush books "Redis"
QUEUED
> incr books
QUEUED
> lpush books "python"
QUEUED
> lrange books 0 -1
QUEUED
> exec
1) (integer) 1
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) (integer) 2
4) 1) "Python"
   2) "Redis"

上面的例子是事务执行到中间遇到失败了,因为不能对一个字符串进行 incr 命令,事务在遇到命令执行失败后,后续的命令还继续执行,所以 books 的值能继续得到设置。这种异常只有程序员在代码中避免。

事务的 ACID

原子性

原子意味着要么一起成功执行,要么一起失败回滚。Redis 提供的所有 api 都是原子操作。那么 Redis 事务只要保证在一批操作中保证原子性,但是在运行时异常中,在一个事务中一个命令出现异常,其他命令还是会继续执行,事务没有回滚机制,所以 Redis 事务是不保证原子性的。

一致性

事务异常

如果命令错误事务无法执行,如果是运行时异常,Redis 会将错误包含在返回结果中,并不影响后续执行,所以事务是一致性的。

Redis 进程被终结

在纯内存模式下,Redis 没有做持久化,重启之后数据库是空白的,所以是事务一致性的。

在 RDB 模式下,事务并不会在中途执行保存 RDB 文件的工作,只有在事务执行完后,RDB 工作才可能会开始。所以在事务执行过程中 Redis 进程被杀死,不管成功多少都不会保存到 RDB 文件中,所以是一致性的。

在 AOF 模式下,事务部分语句被写入 AOF 文件并保存成功,不完整的事务被保存到了 AOF 文件,当重启 Redis 时,检查 AOF 文件不完整,Redis 退出并报错。需要把这段不完整的事务删除后才能重启成功,所以是一致性的。

在 AOF 模式下,事务并未被写入 AOF 文件,所以重启后 Redis 数据库是最近一次成功保存到 AOF 文件中的数据。并没有这次事务的数据,所以是以一致性的。

隔离性

Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。所以事务是带有隔离性的。

持久

在纯内存模式下,事务肯定不是持续性的。

在 RDB 模式下,服务器可能在事务执行之后、RDB 文件更新之前的这段时间失败,所以 RDB 模式下的事务也是不持久的。

在 AOF 模式下,将命令添加到 AOF 文件中,但是对文件进行写入并不会马上写到磁盘上,而是先存储到缓冲区。所以数据保存到磁盘上有一段非常小的时间间隔。这种模式下事务也不是持久的。

结语

本文介绍了 Redis 的事务的 multi,exec,discard,watch  命令用法和 它的 ACID。

到此这篇关于一文教你学会Redis的事务的文章就介绍到这了,更多相关Redis事务内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文教你学会Redis的事务

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

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

猜你喜欢
  • 一文教你学会Redis的事务
    目录Redis 中的使用开始事务命令入队执行事务discard 命令watch 命令事务异常命令错误运行时异常事务的 ACID原子性一致性隔离性持久结语Redis 作为内存的存储中间...
    99+
    2022-11-13
    Redis 事务
  • 一文带你学会Java事件机制
    目录委托事件模型核心组件总结相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控件的绑定,当我们需要在点击某个按钮实现某些操作的时...
    99+
    2024-04-02
  • 一篇文章带你学会JavaScript计时事件
    目录JavaScript 计时事件setInterval() 方法clearInterval() 方法setTimeout() 方法clearTimeout() 方法总结 ...
    99+
    2022-11-16
    javascript计时事件 js 计时 js常用事件
  • 一文教你学会在Vue3中自定义指令
    目录1. 成果展示2. 指令基础2.1 两种作用域2.2 七个钩子函数2.3 四个参数2.4 动态参数3. 自定义权限指令TienChin 项目前端是 Vue3,前端有这样的一个需求...
    99+
    2024-04-02
  • 一篇文章教你学会js实现弹幕效果
    目录新建一个html文件:搞出初始模版HTML添加CSS填充js逻辑代码动画效果下面是弹幕效果 : 相信小伙伴们都看过了,那么它实现的原理是什么呢,那么我们前端怎么用我们web技术...
    99+
    2024-04-02
  • 一文带你学会MySQL的select语句
    目录SQL概述SQL背景知识SQL语言排行榜SQL 分类SQL语言的规则与规范基本规则SQL大小写规范 (建议遵守)注释命名规则(暂时了解)数据导入指令基本的SELECT语句SELECT...SELECT ......
    99+
    2024-04-02
  • 一文带你学会Spring JDBC的使用
    目录1、JDBC2、使用2.1、配置数据源2.2、HikariCP2.3、JdbcTempLate1、JDBC JDBC 就是 数据库开发 操作的 代名词,因为只要是现代商业项目的开...
    99+
    2024-04-02
  • 一文学会 CentOS7 安装配置 Redis
    ✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:...
    99+
    2023-08-24
    redis java spring boot
  • 一文教你如何快速学会Go的struct数据类型
    目录什么是结构体创建结构体创建匿名结构体访问结构体字段结构体零值结构体指针匿名字段结构体嵌套字段升级结构体导出结构体比较什么是结构体 结构是表示字段集合的用户定义类型。它可以用于将数...
    99+
    2023-03-07
    Go struct数据类型 Go struct
  • 一篇文章教会你PYcharm的用法
    目录一、界面介绍二、设置中文(无需汉化包)三、常用快捷键一些常用设置:四、Python 标识符和关键字1、标识符2、 关键字五、行和缩进六、Python 引号七、Python注释1、...
    99+
    2024-04-02
  • 一文教你学会定位线上MySQL锁超时问题
    前言: 昨晚我正在床上睡得着着的,突然来了一条短信。 什么?线上的订单无法取消! 我赶紧登录线上系统,查看业务日志。 发现有mysql锁超时的错误日志。 不用想,肯定有另一个事务正在修改这条订单,持有这条订单的锁。 ...
    99+
    2022-08-16
    定位线上MySQL锁超时 上MySQL锁超时问题
  • 一篇文章教你学会使用Python绘制甘特图
    目录优点局限一日一书 用来制作甘特图的专业工具也不少,常见的有:Microsoft Office Project、GanttProject、WARCHART XGantt、jQuer...
    99+
    2024-04-02
  • 一文教会你用Python读取PDF文件
    目录实战场景Python PDF 实战编码补充实战场景 Python 工程师在日常的工作中,经常会碰到解析和处理PDF文件的情况,实战中需求主要分为如下情况: 提取 PDF 中的文字...
    99+
    2024-04-02
  • 一步步教会你redis如何配置密码
    目录Redis如何配置密码临时配置密码永久设置redis密码命令总结总结redis如何配置密码 临时配置密码 通过以下方式配置密码,只会临时生效,重启redis服务器,就还原了 我们可以看到我们redis目前是没有密码的...
    99+
    2024-01-29
    Redis配置密码 redis密码设置方法 Redis设置密码
  • 一文带你学会使用PHP接口
    目录1. 概念2. 定义3. 实现4. 使用5. 使用场景5.1 多态性5.2 类型约束5.3 模块化编程6. 总结PHP 中的 Interface 是一种非常重要的特性,它允许开发...
    99+
    2023-05-18
    PHP 接口 PHP Interface
  • 一文带你学会Java网络编程
    目录1.java网络编程概述2.InetAddress类3.Socket 编程4.TCP编程TCP字节流编程TCP字符流编程5.网络上传文件6.TCP文件下载1.java网络编程概述...
    99+
    2022-11-13
    Java网络编程 Java 网络
  • 一篇文章带你彻底搞懂Redis 事务
    目录Redis 事务简介Redis 事务基本指令实例分析Redis 事务与 ACID总结Redis 事务简介 Redis 只是提供了简单的事务功能。其本质是一组命令的集合,事务支持一次执行多个命令,在事务执行过程中,会顺...
    99+
    2024-04-02
  • 一篇文章带你彻底搞懂Redis 事务
    目录Redis 事务简介Redis 事务基本指令实例分析Redis 事务与 ACID总结Redis 事务简介 Redis 只是提供了简单的事务功能。其本质是一组命令的集合,事务支持一...
    99+
    2022-11-13
    redis有几种部署方式 redis事务三大特性 redis怎么做到事务回滚
  • 一文教会你在MySQL中使用DateTime
    目录mysql 日期时间教程  MySQL 日期和时间类型MySQL 日期时间  简单的日期和时间计算  日期函数的基本算术运算  NOW() 函数  CURRENT_D...
    99+
    2024-04-02
  • 一文教会你pandas plot各种绘图
    目录一、介绍1.1 参数介绍1.2 其他常用说明二、举例说明2.1 折线图 line2.2 条型图 bar2.3 直方图 hist2.4 箱型图 box2.5 区域图 area2.6...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作