Redis中事(Transaction)是一组命令的集合,事物,命令 都是redis的最小执行单位。一个事物中的命令要么都执行,否则都不执行。类似于关系型数据库的事物概念,但也有很大的区别。
Redis中事物的原理:
现将属于事物的命令发送为Redis,然后再让redis一次且依次执行这些命令。
>multi //开启事物
>sadd "user:1:following" 1
>queued//表示命令进去reids事物队列
>sadd "user:2:following" 2
>queued
>exec //执行队列中缓存命令
如果在发送exec命令之前,客户端断线,redis会清空事物队列,队列中的命令都不会执行。
如果发送了exec命令,即使客户端断了,队列中的命令也会依次执行。
执行时发生错误:
1.在向事物队列发送命令时,出现语法错误,并体现出来,输入exec后,正确的也不执行
2.在向事物队列发送命令时,并没有显示错误体现出来,输入exec后,即使有的执行异常,也不会影响其他的执行。
总结:编译异常,则都不执行;运行时异常,只执行正确的。reids中没有回滚机制
在事物中可以使用watch
watch命令的作用:当被监控的键值被修改后阻止之后一个事物的执行。但是不能保证其他客户端不修改这一键值。
执行exec后,会取消对所有键值的监控。
注:如果使用watch命令监控一个拥有生存时间的建,该建时间到期自动删除并不会被watch命令认为被改变。即watch无感知
从事务的几个特点论述:
1)原子性:将多个事务当作一个整体,要么都做,要么都不做。
redis不支持回滚(与关系型数据库最大的不同),即使队列中某个命令出现错误(比如某个命令的参数错误),也会继续执行,这样执行后的结果是一些命令成功了,一些命令失败了。
2)一致性:执行事务前数据库是一致的,执行之后,无论成败,数据库也是一致的。
一致性描述了数据符合数据库本身的定义和需求,没有包含非法或者无效的错误数据。
3)隔离性:数据库中有多个事务并发执行时,事务之间不会互相影响,并且在并发状态下执行的事务与串行执行的事务产生的结果完全相同。
Redis是单线程,而且事务不会中断。因此,事务总是以串行的方式运行,所以具有隔离性。
4)持久性:当一个事物执行完毕时,执行事务所得到的结果将保存到永久性存储介质中,即使服务器在事务执行完毕后停机,执行事务所得到结果不会丢失。
Redis的事务持久化由持久化模式决定。
当服务器在AOF模式下,且appendsync选项的值为always的时候,程序总是在执行命令之后调用同步函数(sync),将命令数据真正地保存到硬盘里。这种配置下的事务满足持久性,其他场景不满足。
参考书籍:《Redis设计与实现》