Redis事务入门及命令
文章目录
- Redis 事务入门及命令
- 事务概念
- Redis 事务概念
- Redis 事务特性
- Redis 三个阶段
- 入门代码示例
- Redis 相关命令
- MULTI
- DISCARD
- EXEC
- WATCH
- UNWATCH
Redis 事务入门及命令
事务概念
数据库事务( transaction )是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
事务必须满足所谓的ACID属性
Redis 事务概念
Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
总结:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
Redis 事务特性
Redis事务的三个特性:
单独的隔离操作:事务中的所有命令都会被序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念: 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
不保证原子性:事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
Redis 三个阶段
Redis的一个事务从开始到执行会经历以下三个阶段:
- 开始事务:使用
MULTI
开启一个事务 - 命令入队:当开启一个事务之后,之后所有的命令不会马上被执行,而是会被放入到一个事务队列中,然后返回 QUEUED, 表示命令已入队
- 执行事务:那么当
EXEC
命令执行时, 服务器根据客户端所保存的事务队列, 以先进先出(FIFO)的方式执行事务队列中的命令:最先入队的命令最先执行,而最后入队的命令最后执行
入门代码示例
以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUEDredis 127.0.0.1:6379> GET book-name
QUEUEDredis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUEDredis 127.0.0.1:6379> SMEMBERS tag
QUEUEDredis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"2) "C++"3) "Programming"
结果图如下:
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
这是官网上的说明 From redis docs on transactions:
It’s important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
比如:
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。
Redis 相关命令
下表列出了 redis 事务的相关命令:
命令 | 说明 |
---|---|
MULTI
|
标记一个事务块的开始。 |
DISCARD
|
取消事务,放弃执行事务块内的所有命令。 |
EXEC
|
执行所有事务块内的命令。 |
WATCH key [key ...]
|
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
UNWATCH
|
取消 WATCH 命令对所有 key 的监视。 |
MULTI
Redis Multi 命令用于标记一个事务块的开始。事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
返回值:
- 总是返回 OK
代码示例:
redis 127.0.0.1:6379> MULTI # 标记事务开始
OKredis 127.0.0.1:6379> INCR user_id # 多条命令按顺序入队
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> PING
QUEUEDredis 127.0.0.1:6379> EXEC # 执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
DISCARD
Redis Discard 命令用于取消事务,放弃执行事务块内的所有命令。
返回值:
- 总是返回 OK
代码示例:
redis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> PING
QUEUEDredis 127.0.0.1:6379> SET greeting "hello"
QUEUEDredis 127.0.0.1:6379> DISCARD
OK
取消事务之后
我们是查不到事务块里面的操作的,事务块内的所有命令都被放弃执行了
EXEC
Redis Exec 命令用于执行所有事务块内的命令。
返回值:
执行成功,返回事务块内所有命令的返回值,按命令执行的先后顺序排列。
当操作被打断时,返回空值 nil 。
代码示例:
# 事务被成功执行redis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> INCR user_id
QUEUEDredis 127.0.0.1:6379> PING
QUEUEDredis 127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG# 监视 key ,且事务成功执行redis 127.0.0.1:6379> WATCH lock lock_times
OKredis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> SET lock "hazi"
QUEUEDredis 127.0.0.1:6379> INCR lock_times
QUEUEDredis 127.0.0.1:6379> EXEC
1) OK
2) (integer) 1# 监视 key ,且事务被打断redis 127.0.0.1:6379> WATCH lock lock_times
OKredis 127.0.0.1:6379> MULTI
OKredis 127.0.0.1:6379> SET lock "yurug" # 就在这时,另一个客户端修改了 lock_times 的值
QUEUEDredis 127.0.0.1:6379> INCR lock_times
QUEUEDredis 127.0.0.1:6379> EXEC # 因为 lock_times 被修改, joe 的事务执行失败
(nil)
WATCH
Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
语法如下:
WATCH key [key ...]
返回值:
- 总是返回 OK
代码示例:
redis> WATCH lock lock_times
OK
UNWATCH
Redis Unwatch 命令用于取消 WATCH 命令对所有 key 的监视。
返回值
- 总是返回 OK
实例
redis 127.0.0.1:6379> WATCH lock lock_times
OKredis 127.0.0.1:6379> UNWATCH
OK
Redis事务入门及命令相关推荐
- Redis事务、MULTI 命令和EXEC 命令
Redis事务 文章目录 Redis事务 事务实例 MULTI 命令 EXEC 命令 事务异常 1. 进入队列之前发生错误 Redis 是没有回滚操作的 Watch 命令 执行 watch 命令,不执 ...
- Redis事务,watch命令学习
redis事务: redis的事务和mysql等关系型数据库的事务不太一样,redis中的事务不会回滚,只能手动收拾事务失败后的烂摊子. 在命令行中,MULTI是事务的开始命令.EXEC是事务的执行命 ...
- Redis事务(二)-WATCH命令的实现
WATCH命令的实现 概述 使用WATCH命令监视数据库键 监视机制的触发 判断事务是否安全 概述 WATCH命令是一个乐观锁(optimistic locking) 它可以在EXEC命令执行之前,监 ...
- Redis事务控制|相关命令|队列失败两种情况|官方解释无回滚|悲观锁和乐观锁简单介绍
相关命令 命令队列执行失败的两种情况 1.执行队列时失败:错误在入队时检测不出来,整个队列执行时有错的命令执行失败,但是其他命令并没有回滚. 加入队列时失败:遇到了入队时即可检测到的错误,整个队列都不 ...
- 图解Redis事务机制
来自:Java中文社群 作为关系型数据库中一项非常重要的基础功能--事务,在 Redis 中是如何处理并使用的? 1.前言 事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只 ...
- python redis事务_python redis事务源码及应用分析
在多个客户端同时处理相同的数据时,不谨慎的操作很容易导致数据出错.一般的关系型数据库中有事务保证了数据操作的原子性,同样Redis中也设置了事务,可以理解为"将多个命令打包,然后一次性.按顺 ...
- 面试问到 Redis 事务,我脸都绿了。。
前言 前几天有读者说自己面试被问到Redis的事务,虽然不常用,但是面试竟然被问到,平时自己没有注意Redis的事务这一块,面试的时候被问到非常不好受. 虽然,这位读者面试最后算是过了,但是薪资方面没 ...
- redis事务不具有回滚机制,那么它是如何进行事务控制的
redis事务 任何数据库都要有一套自己的事务控制机制,redis事务是一次可以执行多个命令,它的本质是一组命令的集合.一个事务中所有的命令都会被序列化,在事务执行的过程中会按照顺序执行队列中的命令. ...
- Redis : redis事务
Redis的事务功能详解 MULTI.EXEC.DISCARD和WATCH命令是Redis事务功能的基础. Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >R ...
最新文章
- 寒假与春节终归,新学期和新任务又至
- POJ - 1321 棋盘问题
- CENTOS7 修改 网卡名称为eth0的配置方法
- 优必选发布新一代大型机器人Walker X
- 单片机0 99c语言程序,单片机C语言程序设计实训99例.doc
- Hadoop学习整理
- yuicompressor java_YUI Compressor使用配置方法 JS/CSS压缩工具
- JavaEE之HTML常见标签及个人简历制作
- 如何准备全国大学生电子设计大赛控制题?
- PSV1000刷黑商
- 【无人机系统】四轴飞行器及其UAV飞控系统 - 桂林电子科技大学信息科技学院 电子工程系(一)
- The type of the expression must be an array type but it resolved to ListObj
- MT【133】磨刀不误砍柴工
- boost noncopyable实现与ADL
- 如何测试网页的登录页面(转载)
- SVN报错:Cannot checkout from svn: svn: E155000: 'F:\SVN-Flx\。。。。' is alrea
- 停车还能360全方位影像_路虎(揽胜运动星脉极光发现)车主如何选购360全景安全辅助系统...
- ffmpeg 拼接mp4_通过 ffmpeg 无损剪切/拼接视频
- 远程无线视频监控知识
- zabbix配置钉钉报警