Redis的事物及锁操作

    Redis中也提供了类似数据库中的事务和锁的概念,基本用法如下:

    开启事务:multi

    取消事务:discard

    提交事务:exec

    例如转账交易,用户张三需要将自己账户中的钱转出100元到李四的账户,具体的操作可以分为两步,第一步将张三账户中的钱减少100元,第二步将李四账户的钱增加100元。这个转账交易必须是一个原子操作,也就是说上述两步必须同时执行成功,否则就会出现单边交易。在Redis中可以这样操作:

Redis的事物及锁操作_第1张图片

    以上就是Redis中关于事务的一个完整操作,Redis实现事务的机制很简单,就是在执行multi命令后开启事务处理,在提交事务(exec)或取消事务(discard)之前执行的所有命令都不会真正执行,而是放到一个队列QUEUE中,当执行exec时,就会从这个队列中逐条执行命令,在这期间不允许其他命令干扰执行。当执行discard命令时,就将队列中的所有命令清空不再执行。

    需要注意的是Redis的事务机制并不是像很多数据库那样的严谨,以上面的转账为例,如果在执行李四账户增加100元时,执行的是另外一个语句,而不是给李四账户增加100元钱,只要这个语句没有语法错误,而是类型错误。那么即使这个语句在执行的时候出现错误,但是在他之前命令也会正常执行,也就是说张三的账户会减少100元钱。这和数据库是不一样的。例如:

Redis的事物及锁操作_第2张图片

    Redis中的锁是采用的乐观锁机制,使用watch命令来监控我关心的key在使用之前是否被改动了,已订票系统为例:

Redis的事物及锁操作_第3张图片

这里只剩下一张票了,李四在买票之前需要监控票的状态,如果在执行watch命令和exec命令之间,正好张三将这张票买走了,如:


这时候李四再提交事务的时候就会什么都不执行。这就是Redis中锁的概念。

watch key1,key2...keyn可以监听多个key。

unwatch命令可以取消当前的所有的监控。

你可能感兴趣的:(Redis)