本文共 1020 字,大约阅读时间需要 3 分钟。
数据库当中为了保证数据的一致性,都会提供一定的事务操作,对于缓存数据当然也不例外,会提供一定的事务操作,来保证整个操作过程的原子性。
redis当中提供的事务性,可以从以下几个命令了解
Multi 用来开启一个事务,类似于数据库当中begin
EXEC 执行一个事务,类似于数据库当中的commit
DISCARD 放弃一个事务的执行,类似于rollback
WATCH 监听特定的key, 这个类似于java当中的CAS,从检测那刻起,如果对应的key的value发生了变化,就放弃修改。也可以理解为数据库当中的乐观锁。
接下来我们相信介绍下这几个命令。
在使用multi进行开始事务之后,后面的指令都会被缓存起来,如果返回queued,表示数据被成功保存到了缓存当中,在执行exec时,会将缓存起来的命令作为一个事务进行执行。
注意:如果开启了持久化,事务当中的命令在执行成功之后,就会通过write命令一次性写入到磁盘当中,如果在写入过程中出现了断电等故障问题,就会只有一部分命令被写入了,这时候就会出现AOF不完整的情况,这个时候可以通过redis-check-aof工具修复这个问题,将不完整的命令移除,保证数据的完整性。
如果在执行exec之前有指令错误,这并不影响其他指令的执行。
Watch指令
127.0.0.1:6379> set age 23OK127.0.0.1:6379> watch age //开始监视ageOK127.0.0.1:6379> set age 24 //在EXEC之前,age的值被修改了OK127.0.0.1:6379> multiOK127.0.0.1:6379> set age 25QUEUED127.0.0.1:6379> get ageQUEUED127.0.0.1:6379> exec //触发EXEC(nil) //事务无法被执行
在watch指令之后进行了key的修改,然后再开启事务,最终执行,这种情况下,是会提示执行失败的,
注意:禁止在multi和exec指令之间执行watch指令,watch指令只能在multi指令之前使用。
DISCARD指令
> get books(nil)> multi //开始事务OK> incr booksQUEUED> incr booksQUEUED> discard //放弃事务内的修改指令OK> get books(nil)