修改器内存写入失败_Redis 事务,以及事务失败的处理
事务命令
- Redis事务,会将所有命令放入一个命令队列中,再由队列中执行命令。
- 事务的命令分为:
- MULTI 开始事务---->各种命令操作,SET,GET,SADD等等(每一步操作后,会显示QUEUED,表示已经入队命令队列)---->EXEC执行命令队列
- DISCARD:取消一个事务,清空事务命令队列,客户端调整为非事务状态
- WATCH:在进入事务之前执行,监听任意数量的key,当调用EXEC时,如果这个key被其他用户修改了,那么事务不在执行,返回失败。
- 以下示例展示了一个执行失败的事务例子:
redis> WATCH name
OK
redis> MULTI
OK
redis> SET name peter
QUEUED
redis> EXEC (nil)
以下执行序列展示了上面的例子是如何失败的:
时间 客户端 A 客户端 B
T1 WATCH
name
T2 MULTI
T3SET
name
peter
T4 SET
name
john
T5EXEC
在时间 T4 ,客户端 B 修改了 name
键的值, 当客户端 A 在 T5 执行 EXEC 时,Redis 会发现 name
这个被监视的键已经被修改, 因此客户端 A 的事务不会被执行,而是直接返回失败。
ACID
Redis 的事务保证了 ACID 中的一致性(C)和隔离性(I),但并不保证原子性(A)和持久性(D)。
1.原子性(一个事务所有操作要么全部成功,要么全部失败)
redis的单个命令是原子性的,但是事务中的的redis命令,就算后面的命令失败/终止了(比如KILL进程,主机宕机等),此时事务失败,前面执行的命令也不会回滚。
2.一致性
(1)不正确入队命令的事务不会被执行,不会影响数据库的一致性
(2)命令执行中的错误,将错误包含在事务结果中,不会中断事务,不影响已执行结果,也不影响后面命令的执行,对事务的一致性也没有影响。
(3)进程终结
- 内存模式:如果 Redis 没有采取任何持久化机制,那么重启之后的数据库总是空白的,所以数据总是一致的。
- RDB 模式:在执行事务时,Redis 不会中断事务去执行保存 RDB 的工作,只有在事务执行之后,保存 RDB 的工作才有可能开始。所以当 RDB 模式下的 Redis 服务器进程在事务中途被杀死时,事务内执行的命令,不管成功了多少,都不会被保存到 RDB 文件里。恢复数据库需要使用现有的 RDB 文件,而这个 RDB 文件的数据保存的是最近一次的数据库快照(snapshot),所以它的数据可能不是最新的,但只要 RDB 文件本身没有因为其他问题而出错,那么还原后的数据库就是一致的。
- AOF 模式:因为保存 AOF 文件的工作在后台线程进行,所以即使是在事务执行的中途,保存 AOF 文件的工作也可以继续进行,因此,根据事务语句是否被写入并保存到 AOF 文件,有以下两种情况发生:
1)如果事务语句未写入到 AOF 文件,或 AOF 未被 SYNC 调用保存到磁盘,那么当进程被杀死之后,Redis 可以根据最近一次成功保存到磁盘的 AOF 文件来还原数据库,只要 AOF 文件本身没有因为其他问题而出错,那么还原后的数据库总是一致的,但其中的数据不一定是最新的。
2)如果事务的部分语句被写入到 AOF 文件,并且 AOF 文件被成功保存,那么不完整的事务执行信息就会遗留在 AOF 文件里,当重启 Redis 时,程序会检测到 AOF 文件并不完整,Redis 会退出,并报告错误。需要使用 redis-check-aof 工具将部分成功的事务命令移除之后,才能再次启动服务器。还原之后的数据总是一致的,而且数据也是最新的(直到事务执行之前为止)。
3.隔离性
Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。
4.持久性
由redis的持久化模式决定:
- 内存模式-无持久化
- RDB-服务器可能在事务执行之后、RDB 文件更新之前的这段时间失败,所以 RDB 模式下的 Redis 事务也是不持久的。
- AOF-后台每秒
fsync
策略,不是主线程阻塞执行,如果在保存时宕机,可能有一秒数据丢失,也非持久的。
修改器内存写入失败_Redis 事务,以及事务失败的处理相关推荐
- QQ资料修改器无法连接封面服务器,QQ编辑资料失败/qq头像和昵称无法修改怎么办 是什么原因?...
2018QQ编辑资料失败/qq头像和昵称无法修改原因及解决方法,来看看2018QQ编辑资料失败/qq头像和昵称无法修改原因及解决方法. 2018qq编辑资料失败怎么回事? 当你修改头像或网名时,左上角 ...
- 二十一、PHP框架Laravel学习笔记——模型的访问器和修改器
一.访问器 访问器:就是在获取数据列表时,拦截属性并对属性进行修改的过程: 比如,我们在输出性别时,在性别左右加上括号,或给邮件转换为大写: //访问器,前固定 get,后固定 Attribute,G ...
- 21.模型的访问器和修改器
学习要点: 1.访问器 2.修改器 本节课我们来开始学习数据库模型的访问器和修改器的使用. 一.访问器 1. 访问器:就是在获取数据列表时,拦截属性并对属性进行修改的过程: 2. 比如,我们在输出性别 ...
- Java外挂开发之内存修改器(类似CE)
最近闲着蛋疼,无聊之中用CE耍了一哈游戏,发现挺好用的,于是就想,我自己能不能写个内存修改器呢?于是乎,这个软件就诞生了! 当然我只会Java,C++嘛,了解了解,嘿嘿,所以这个工具也是用Java写的 ...
- 打造自己的游戏修改器和内存补丁
相信很多人打游戏的时候都用修改器,这里我介绍怎样用VB编写修改器. 1.其实修改器原理很简单,一般来说,在游戏运行的时候我们对游戏内存空间中必要的数据进行修改就可以了.举个例子来说,一款拳皇模拟器里游 ...
- 新月剑痕十项属性内存修改器
这几天忙里偷闲,在网上闲逛荡,在浏览有什么好玩的单机游戏的时候注意到了这个新月剑痕,看了看介绍,感觉不错,经过在敞开的机箱里面一顿操作之后,终于成功进入游戏,开始的时候还是比较简单了,不过玩了一会就没 ...
- 游戏修改器制作教程四:用API读写内存
本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...
- 超漂亮的内存修改器,可以媲美某类似软件,UI界面反复调整 功能更加人性化,更多隐藏功能待您发现
内存修改器:(有个比较有名的Cheat Engine修改器,功能十分相似,可能没ce专业,界面UI是反复调整后的) 对比图 一般是修改某应用在变化的某值,确定其内存地址(通过2次搜索锁定目标)然后写入 ...
- 使用VC2008制作简单大航海外传内存修改器
作者 :小草 日期 :2010/7/4 始发于 http://bbs.evewind.net/read.php?tid=2815 程序源代码下载地址: http://code.google.com/p ...
最新文章
- 工作心得之-------关于“表现”
- Spring boot处理附件的一个坑
- 【Servlet】请求转发与重定向
- 《剑指Offer》用两个栈来实现队列
- css3学习下...
- mysql跨服务器链表_MySQL 源码链表的实现
- 实例验证WEB浏览器智能应对节点失效
- 完美且精准的 IE10- 版本检测。
- Java基础IDEA快捷键
- STM32F103学习笔记(9)——NB-IoT模块BC26使用
- MultiDesk远程桌面连接
- 一款好看流光风格个人主页HTML源码
- MacOS修改Hosts文件
- 简单的哈夫曼树程序实现
- 【Python】唯品会购买商品
- Unity3d shader 教程一 准备
- sap采购申请自动转采购订单_采购订单_参考第三方销售生成的采购申请
- 数字化的野蛮生长需要驯服
- B2C电商系统整体功能和流程设计(总结)
- hamachi联机_Unturned hamachi联机教程
热门文章
- python中如何调用类_python中如何调用类的方法
- 在java中使用关键字导入包_java的import关键字的使用
- jQuery 配置和基本语法
- Python中文件操作和文件夹操作的学习笔记
- Java获取函数参数名称
- leetcode679:24Game
- one stage 与two stage解释
- Python中的list/tuple/dict/set数据类型详解
- leetcode961. N-Repeated Element in Size 2N Array
- leetcode898.BitwiseORsofSubarrays