Redis的事务:
Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis的最小执行单元,一个事务中的命令要么都执行,要么都不执行。
事务的原理是先将属于一个事务的命令请求打包发送给Redis,然后再让Redis一次性、按顺序地执行这些命令。
在事务执行期间,服务器不会中断事务而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。
事务示例:
redis> MULTI
OK
redis> SADD "user:1:following" 2
QUEUED
redis> SADD "user:2:followers" 1
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 1
上面的代码演示了事务使用方式。
首先MULTI命令告诉Redis,下面的命令属于一个事务,先缓存不执行;
Redis回答OK;
发送两个SADD命令,Redis没有执行命令,而是放入等待队列QUEUED;
要执行的命令发送完毕后,发送EXEC命令告诉Redis可以执行了;
Redis将等待执行的命令按照发送顺序执行,并依次返回执行结果。
事务的ACID性质
在Redis中,事务总是具有原子性(Atomicity)、一致性(Consistency)和隔离性(Isolation),并且当Redis运行在某种特定的持久化模式下时,事务也具有耐久性(Durability)。
原子性:事务中的所有命令打包一次性执行,不允许插队;
一致性:Redis通过谨慎的错误检测和简单的设计来保证;
隔离性:单线程执行事务,并保证执行期间不会中断;
耐久性:需要特定的持久化模式支持。
故障处理:
如果在发送EXEC命令前客户端断线,则Redis会清空事务队列,所有命令都不执行;但如果已经发送了EXEC命令后客户端断线,则Redis会执行所有命令的。
Redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入。
如果一个事务中的某个命令执行出错,Redis会如何处理?
当在命令执行前出现错误,如语法错误,Redis会直接返回错误,所有命令都不执行;
当在命令执行中出现错误,如执行某个命令时运行时错误,由于执行前无法发现,Redis会接受并执行,所有命令都会执行。
Redis的事务没有关系数据库事务提供的回滚(rollback)功能。