文档章节

redis 事务特性

w
 walle-Liao
发布于 2016/03/30 21:33
字数 1139
阅读 71
收藏 1

Redis 事务

redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client,然后结束事务上下文。

Redis 事务特性

数据ACID特性满足了几条?

为了保持简单,redis事务保证了其中的一致性和隔离性;

不满足原子性和持久性;

原子性

redis事务在执行的中途遇到错误,不会回滚所有的命令,而是继续执行后续命令;(违反原子性)

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作;

中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做;

 

示例:

127.0.0.1:6379> set b 11   # 设置 b 对应的 value 为字符串类型

OK

127.0.0.1:6379> multi  # 开启事物

OK

127.0.0.1:6379> sadd a aa aaa   # 添加一个 set key  a

QUEUED

127.0.0.1:6379> sadd b bb bbb   添加一个 set key  b,此时因为 b 对应的 key 已被占用,而且对应的数据类型为 string,所以这里会失败

QUEUED

127.0.0.1:6379> sadd c cc ccc   # 添加一个 set key  c

QUEUED

127.0.0.1:6379> exec   提交事务,两个成功一个失败,并没有全部回滚

1) (integer) 2

2) (error) WRONGTYPE Operation against a key holding the wrong kind of value

3) (integer) 2

127.0.0.1:6379> SMEMBERS a

1) "aa"

2) "aaa"

 

持久性

事务不过是用队列包裹起了一组 Redis 命令,并没有提供任何额外的持久性功能,所以事务的持久性由 Redis 所使用的持久化模式决定:

  • 在单纯的内存模式下,事务肯定是不持久的。

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

  •  AOF 的“总是 SYNC ”模式下,事务的每条命令在执行成功之后,都会立即调用 fsync  fdatasync 将事务数据写入到 AOF 文件。但是,这种保存是由后台线程进行的,主线程不会阻塞直到保存成功,所以从命令执行成功到数据保存到硬盘之间,还是有一段非常小的间隔,所以这种模式下的事务也是不持久的。

  • 其他 AOF 模式也和“总是 SYNC ”模式类似,所以它们都是不持久的。

 

隔离性和一致性

redis事务在执行的过程中,不会处理其它命令,而是等所有命令都执行完后,再处理其它命令(满足隔离性)

redis事务在执行过程中发生错误或进程被终结,都能保证数据的一致性;

 

事务操作示例

正常的提交事务

事务回滚

乐观锁

另一个 client 修改 watchkey 的值,导致主窗口的事务提交失败


© 著作权归作者所有

w
粉丝 3
博文 15
码字总数 15775
作品 0
深圳
私信 提问
Redis中事务ACID支持程度

事务是一个数据库必备的元素,对于redis也不例外,对于一个传统的关系型数据库来说,数据库事务满足ACID四个特性: A代表原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全...

石日天
03/27
0
0
Redis中的事务

事务同命令一样,都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。 一、Redis事务的实现 Redis通过multi、exec、watch等命令来实现事务功能,Redis中一个事务从开始到结...

u012050154
2017/11/29
0
0
使用 TiKV 构建分布式类 Redis 服务

什么是 Redis Redis 是一个开源的,高性能的,支持多种数据结构的内存数据库,已经被广泛用于数据库,缓存,消息队列等领域。它有着丰富的数据结构支持,譬如 String,Hash,Set 和 Sorted S...

siddontang
2018/07/29
0
0
Redis Keys的通用操作

进入redis -cli: keys * 查看所有key keys my? 查看以my开头的key del my1 exists my1 查看该key是否存在 get company 获取value rename company newcompany 重命名 expire newcompany 1000......

王怀楼
2018/10/09
0
0
redis-game-transaction

README.md Redis-分布式-事务 在大型游戏中经常使用分布式,分布式中因为游戏逻辑会经常游戏事务,借助redis某些特性我们可以实现分布式锁和分布式事务。很多redis集群不支持redis的事务特性...

snowcattle
2016/12/15
22
0

没有更多内容

加载失败,请刷新页面

加载更多

未来,哪些技术在前端开发的地位会越来越高?

转眼2019也快走到下半年,过去的这段时间里,不论是互联网巨头还是初创企业,都纷纷进行了一波优化。渐趋理智的资本淘汰了一批不能适应市场的业务,而业务的紧缩也淘汰了一批不能适应市场的程...

智云编程
37分钟前
0
0
Golang math基本数学函数

三角函数 正弦函数,反正弦函数,双曲正弦,反双曲正弦 func Sin(x float64) float64 func Asin(x float64) float64 func Sinh(x float64) float64 func Asinh(x float64) float64 一次性返回......

Sunki
40分钟前
0
0
SpringBoot系列教程JPA之新增记录使用姿势

SpringBoot系列教程JPA之新增记录使用姿势 上一篇文章介绍了如何快速的搭建一个JPA的项目环境,并给出了一个简单的演示demo,接下来我们开始业务教程,也就是我们常说的CURD,接下来进入第一...

小灰灰Blog
今天
7
0
大话文本检测经典模型:Pixel-Anchor

文本检测是深度学习中一项非常重要的应用,在前面的文章中已经介绍过了很多文本检测的方法,包括CTPN(详见文章:大话文本检测经典模型CTPN)、SegLink(详见文章:大话文本检测经典模型Seg...

雪饼
今天
2
0
手把手教你写一个RPC

1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)——远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC...

我最喜欢三大框架
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部