redis 事务

时间:2017-07-29 13:40:46   收藏:0   阅读:297
事务相关命令

 
 
Redis通过multi,discard,exec和watch四个命令来实现事务功能,
 
一般事务
 
特殊:watch
 
服务器在执行完事务中的所有命令之后,才会继续处理其他客户端的其他命令
 
 
事务由multi开启,将多个命令入队到事务中,最后exec命令触发事务,一并执行性:
一个事务从开始到执行会经历以下三个阶段:
 
 
事务队列是一个数组,每个数组项包含三个属性
 
例子:
举个例子,如果客户端执行以下命令:
redis> MULTI
OK
redis> SET book-name "Mastering C++ in 21 days"
QUEUED
redis> GET book-name
QUEUED
redis> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis> SMEMBERS tag
QUEUED
 

  

程序为客户端创建一下事务队列
技术分享
技术分享

 

exec,discard,multi,watch 是不放入事务队列中的,而是直接执行的。
 
事务队列的执行结果,放入回复队列中,当执行exec命令会将回复队列作为自己的执行结果放回客户端,
并从事务状态返回到非事务状态。
 
无论在事务状态下,还是在非事务状态下,Redis 命令都由同一个函数执行,所以它们共享很
多服务器的一般设置,比如 AOF 的配置、 RDB 的配置,以及内存限制,等等
 
事务中命令和普通命令的区别
 
Redis 的事务是不可嵌套的,处于事务状态的客户端在发送multi,则服务器只会返回一个简单错误不做任何操作,
继续等待其他命令入队。
 
DISCARD
 
WATCH
 
WATCH命令的实现
 
存储
watch_keys 字典,字典的键是这个数据库被监控的键值,而字典的值则是一个链表,链表保存所有监视这个键的客户端。
技术分享
技术分享

 

 
watch 触发
在任何对数据库键空间( key space)进行修改的命令成功执行之后(比如 FLUSHDB 、 SET、DEL 、LPUSH 、SADD 、ZREM ,诸如此类),
multi.c/touchWatchKey 函数都被调用,检查数据库的watch_keys字典,看是否有客户端在监视已经被命令修改的键。
如果有, 程序将所有监视这个/这些被修改键的客户端的 REDIS_DIRTY_CAS 选项打开,表明事务安全性已经被破坏。
技术分享
 技术分享

 

当客户端发送exec命令,触发事务执行性,服务器会对客户端状态进行检查:
REDIS_DIRTY_CAS
 
最后,当一个客户端结束它的事务时,无论事务是成功执行,还是失败,watched_keys字典中和这个客户端相关的资料都会被清除。
 
事务的ACID性质

在传统的关系式数据库中,常常用 ACID 性质来检验事务功能的安全性。
Redis 事务保证了其中的一致性( C)和隔离性( I),但并不保证原子性( A)和持久性( D)
 
原子性(Atomicity)
事务中命令要么全部执行成功,有一条失败则全部回滚
 
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以Redis事务的执行并不是原子性的
如果 Redis 服务器进程在执行事务的过程中被停止,那么事务执行失败,但是不会回滚。
 
一致性(Consistency)
redis的一致性问题分三部分
 
入队错误
客户端向服务器发送了错误的命令。
 
执行错误
对一个不同类型的 key 执行了错误的操作
 
redis进程被终结
Redis 进程被终结 那么
根据 Redis 所使用的持久化模式,可能有以下情况出现:
 
隔离性(lsolation)
Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执
行完所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。
 
 
持久性(Durability)
因为事务不过是用队列包裹起了一组 Redis 命令,并没有提供任何额外的持久性功能,所以事
务的持久性由 Redis 所使用的持久化模式决定:
 
小结
 

原文:http://www.cnblogs.com/Aiapple/p/7255492.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!