7 Redis 事务
文章目录
- 1 Redis 事务的定义
- 2 Multi、exec、discard
- 2.1 multi 开启事务,exec 提交事务
- 2.2 multi 开启事务,discard放弃事务
- 3 事务的错误处理
- 3.1 组队中出现了错误
- 3.2 执行时出现了错误
- 4 事务冲突的问题
- 4.1 乐观锁
- 4.2 悲观锁
- 4.3 Watch key
- 4.3.1 乐观锁案例
- 5 事务的三个特性
- 5.1 单独的隔离操作
- 5.2 没有隔离级别的概念
- 5.3 不保证原子性
1 Redis 事务的定义
Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、顺序执行。事务在执行过程中,不会被其他客户端发送过来的命令请求所打断。
Redis 事务的主要作用就是串联多个命令防止别的命令插队。
2 Multi、exec、discard
从multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,知道输入exec后,redis会将之前的命令队列中的命令依次执行。
组队的过程中可以通过discard 来放弃组队。
2.1 multi 开启事务,exec 提交事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set key1 value1
QUEUED
127.0.0.1:6379(TX)> set key2 value2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
127.0.0.1:6379>
2.2 multi 开启事务,discard放弃事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set a1 v1
QUEUED
127.0.0.1:6379(TX)> set a2 v2
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379>
3 事务的错误处理
3.1 组队中出现了错误
组队中某个命令出现了错误,执行时整个队列都会被取消。
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set b1 v1
QUEUED
127.0.0.1:6379(TX)> set b2 v2
QUEUED
127.0.0.1:6379(TX)> set b3
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get b1
(nil)
127.0.0.1:6379>
3.2 执行时出现了错误
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,其他命令都会执行,不会回滚。
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set c1 v1
QUEUED
127.0.0.1:6379(TX)> incr c1
QUEUED
127.0.0.1:6379(TX)> set c2 v2
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
127.0.0.1:6379>
4 事务冲突的问题
4.1 乐观锁
乐观锁(Optimistic Lock) 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set 机制实现事务的。
4.2 悲观锁
悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会block(阻塞)直到它拿到锁。传统的关系型数据库里面就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁。
4.3 Watch key
在执行multi 之前,先执行watch key [key…],可以监视一个或多个key,如果在事务执行之前这个key 被其他命令所改动,那么事务将被打断。
4.3.1 乐观锁案例
开启两个事务,watch监视同一个key,第一个事务执行完成后,第二个key执行会失败。
先在第一个客户端设置一个key为blance
127.0.0.1:6379> set blance 100
OK
127.0.0.1:6379> keys *1) "c1"2) "key2"3) "VerifyCode18771105555:count"4) "key1"5) "names"6) "china"7) "c2"8) "sname"9) "k1"
10) "k2"
11) "blance"
12) "name"
13) "user"
14) "k11"
在第二个客户端也可以看到这个key
127.0.0.1:6379> keys *1) "c1"2) "key2"3) "VerifyCode18771105555:count"4) "key1"5) "names"6) "china"7) "c2"8) "sname"9) "k1"
10) "k2"
11) "blance"
12) "name"
13) "user"
14) "k11"
两个客户端同时开启watch监控balance 这个key,并同时开启事务
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> multi
OK
在第一个客户端对balance进行自加10并执行事务,成功
127.0.0.1:6379(TX)> incrby balance 10
QUEUED
127.0.0.1:6379(TX)> exec
1) (integer) 10
127.0.0.1:6379>
在第二个客户端对balance进行自加20 并执行事务,失败
127.0.0.1:6379(TX)> incrby balance 20
QUEUED
127.0.0.1:6379(TX)> exec
(nil)
127.0.0.1:6379>
因为在第二客户端执行时,version版本已经被第一个客户端更新,所以失败。
5 事务的三个特性
5.1 单独的隔离操作
事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
5.2 没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交之前任何指令都不会被被实际执行。
5.3 不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。
7 Redis 事务相关推荐
- redis学习之——Redis事务(transactions)
Redis事务:可以一次执行多个命令,本质是一组命令的集合.一个事务中的,所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 常用命令:MULTI 开启事务 EXEC 提交事务 ...
- 腾讯二面:Redis 事务支持 ACID 么?
❝ 腾讯面试官:「数据库事务机制了解么?」 「内心独白:小意思,不就 ACID 嘛,转眼一想,我面试的可是技术专家,不会这么简单的问题吧」 程许远:「balabala-- 极其自信且从容淡定的说了一通 ...
- 图解Redis事务机制
来自:Java中文社群 作为关系型数据库中一项非常重要的基础功能--事务,在 Redis 中是如何处理并使用的? 1.前言 事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只 ...
- 【带你重拾Redis】Redis事务
Redis事务 Redis的事务主要依赖于WATCH ,UNWATCH,MULTI , EXEC, DISCARD等命令. 其中 MULTI , EXEC , DISCARD 分别对应关系型数据库的 ...
- redis中有key但是删不掉_一篇图文,搞定Redis事务
在面试的时候,通常会被问到redis是如何实现分布式锁的.如果我们只知道是借助于setnx/setex ,而不了解setnx/setex底层如何实现,那基本上是无法过关的,尤其是大厂.那究竟redis ...
- Redis事务和watch
redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...
- 十七、Redis事务
一.Redis事务的概念: Redis 事务的本质是一组命令的集合.事务支持一次执行多个命令,一个事务中所有命令都会被序列化.在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求 ...
- Redis - 事务
一.概述 和传统关系型数据库一样,Redis 同样是支持事务的.Redis 的事务可以通过 MULTI/EXEC/DISCARD/WATCH 等命令来实现. 二.事务的 ACID 特性 1). 原子性 ...
- python redis事务_python redis事务源码及应用分析
在多个客户端同时处理相同的数据时,不谨慎的操作很容易导致数据出错.一般的关系型数据库中有事务保证了数据操作的原子性,同样Redis中也设置了事务,可以理解为"将多个命令打包,然后一次性.按顺 ...
- Redis事务(transaction)
Redis事务(transaction) 本文档翻译自: http://redis.io/topics/transactions . MULTI . EXEC . DISCARD 和 WATCH 是 ...
最新文章
- centos6.5 mysql 远程访问_centos6.5 mysql 设置支持远程ip访问
- Comet oj比赛组队
- python使用什么来表示不同级别的语句块-python通过什么来区分不同的语句块?
- 在EA中画ER图和数据模型图
- 【Chocolatey】安装python3
- 大型开发项目中 git 工作流的最佳实践
- 特征点提取算法 - 01 - 特征的定义基础
- Bootstrap报错:Bootstrap's JavaScript requires jQuery
- HttpRunnerManager(一)--安装
- 常用图像插值算法分析与比较
- iTOP4412 uboot移植教程
- 等价类划分法测试用例设计
- 元宇宙8大创业方向:虚拟偶像、数字孪生…
- 连载:面向对象葵花宝典:思想、技巧与实践(27) - 动态模型设计
- 25_深度学习_汇聚层
- alin42490怎样解除_最新版农药通用名称与CIPAC编号对照表
- MsysGIT -- Windows下GIT提供众多的Linux命令
- vin端口是什么意思_「每日一题」什么是 Web 服务器(server)
- awgn函数 matlab measure 什么意思,Matlab中 awgn 函数输入参数带有‘measured’ 时snr的含义...
- 博士后的那些套路,那些坑
热门文章
- python读取图片属性_[Python图像处理]三.获取图像属性及通道处理
- eset14 杀毒清除无提示
- python输出word内容_Django输出word文件(.doc),只在内容中显示原始html
- mysql 数据迁移_mysql实验--不同字符集数据库迁移步骤演示
- python的底层是c_python基本数据类型底层实现
- 安装百分之80卡住_新车买回来要不要安装发动机护板呢?装好还是不好?
- html框模型,4-2css中的框模型简介
- android背景图拉伸,Android使背景图像不拉伸它指定的视图_android_开发99编程知识库...
- mysql 员工工资上涨5%_工资从1万到3万,你还差mysql数据库优化之系列五
- Towards a topological-geometrical theory of group equivariant non-expansive operators for data analy