Redis扩展功能之事务
所谓事务(Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。Redis作为缓存实现者之一必然支持事务。
Redis事务:
1)Redis的事务是通过multi、exec、discard和watch这几个命令来完成的。
2)Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。
3)Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行。
4)Redis不支持回滚操作(与数据库中事务区别还是蛮大的)。
一、事务命令
multi:用于标记事务块的开始,Redis会将后续的命令逐个放入队列中,然后使用exec原子化地执行这个命令队列。
exec:执行命令队列
discard:清除命令队列
watch:监视key
unwatch:清除监视key
二、事务机制
1、事务执行
1)事务开始
在RedisClient中,有属性flags,用来表示是否在事务中flags=REDIS_MULTI
2) 命令入队
RedisClient将命令存放在事务队列中(EXEC,DISCARD,WATCH,MULTI除外)
3) 事务队列
multiCmd *commands 用于存放命令
4)执行事务
RedisClient向服务器端发送exec命令,RedisServer会遍历事务队列,执行队列中的命令,最后将执行的结果一次性返回给客户端。
如果某条命令在入队过程中发生错误,redisClient将flags置为REDIS_DIRTY_EXEC,EXEC命令将会失败返回。
2、Watch执行
使用WATCH命令监视数据库键:redisDb有一个watched_keys字典,key是某个被监视的数据的key,值是一个链表.记录了所有监视这个数据的客户端。
监视机制的触发:当修改数据后,监视这个数据的客户端的flags置为REDIS_DIRTY_CAS
事务执行:RedisClient向服务器端发送exec命令,服务器判断RedisClient的flags,如果为REDIS_DIRTY_CAS,则清空事务队列。