Redis事务:实现自动回滚(redis事务回滚)
Redis是一款NOSQL非关系型数据库,它支持原子性的单条指令操作,但是并不支持多条指令的“批量”操作,尤其是在高性能的密集读取和写入环境,如果要完成更复杂的多条操作,需要使用Redis的事务来实现。
Redis的事务是通过Transaction类来实现的,它支持原子性的操作:利用watch来监控key的状态,在事务执行拿出key时,如果key被其它线程改动,则不执行,否则可以正确实现“回滚”。
例如,在一个业务场景中,有两个key:count1和count2,key count1的初始值为2,key count2的初始值为8,如果要执行原子性的增加count1加1,减少count2减1操作,以确保两个操作同时发生且任何一步没有状态发生异常,可以使用Redis的事务:
“`javascript
// watch count1 and count2
redis.watch(‘count1′,’count2’);
// start a transaction
var multi = redis.multi();
// count1 + 1
multi.incr(‘count1’);
// count2 – 1
multi.decr(‘count2’);
// run the transaction with auto rollback
multi.exec(function(err, result){
if(err){
// if err, rollback
console.log(‘transaction rollback!’);
}
else{
console.log(‘transaction has been committed!’);
}
当事务开始执行时,Redis会检查watch的key是否被改动,如果有,则会自动回滚,将key的状态保持为检查时的状态,也就是说,在事务的exec方法中可以响应判断,如果err不为空,即说明事务出现异常,数据回滚;如果err为空,即表明数据正常,事务提交。
而Redis的事务的回滚不仅仅能够用在两个加减操作,也可以用在多个set,mset,del等指令中,这样就可以更好的实现一些复杂的逻辑操作。