redis事务和乐观锁

1 MULTI/EXEC

执行本事务。

MULTI

set foo bar

get foo

set foo hello

EXEC

在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行。没有回滚,如果中间有命令失败,已经执行的命令不回滚,还没有执行的命令继续执行完。

 

2 MULTI/DISCARD

放弃本事务,事务中的命令一个也不会执行。

MULTI

set foo bar

get foo

set foo hello

DISCARD

三个命令都不会执行。

 

3 乐观锁

WATCH foo

MULTI

set foo bar

EXEC

如果在事务执行前,foo key有改动的话,事务停止执行。如果没有改动,继续执行。

因为redis是单线程的,实现起来比较简单,执行watch命令的时候,redis server会把该key放入watch列表中。

某个client在执行set操作的时候,如果修改了某个key,会通知所有watch该key的client,该key已经是dirty的了。

在exec执行的时候,会先去看是否有key被修改了,如果有的话,就丢弃本次事务,否则继续执行。

 

4 为什么redis不支持回滚

redis认为不会出现在生产环境中,不回滚更简单。

 

posted @ 2018-04-20 15:15  PhoenixTree(梧桐树)  阅读(236)  评论(0编辑  收藏  举报