Redis中也提供了类似数据库中的事务和锁的概念,基本用法如下:
开启事务:multi
取消事务:discard
提交事务:exec
例如转账交易,用户张三需要将自己账户中的钱转出100元到李四的账户,具体的操作可以分为两步,第一步将张三账户中的钱减少100元,第二步将李四账户的钱增加100元。这个转账交易必须是一个原子操作,也就是说上述两步必须同时执行成功,否则就会出现单边交易。在Redis中可以这样操作:
以上就是Redis中关于事务的一个完整操作,Redis实现事务的机制很简单,就是在执行multi命令后开启事务处理,在提交事务(exec)或取消事务(discard)之前执行的所有命令都不会真正执行,而是放到一个队列QUEUE中,当执行exec时,就会从这个队列中逐条执行命令,在这期间不允许其他命令干扰执行。当执行discard命令时,就将队列中的所有命令清空不再执行。
需要注意的是Redis的事务机制并不是像很多数据库那样的严谨,以上面的转账为例,如果在执行李四账户增加100元时,执行的是另外一个语句,而不是给李四账户增加100元钱,只要这个语句没有语法错误,而是类型错误。那么即使这个语句在执行的时候出现错误,但是在他之前命令也会正常执行,也就是说张三的账户会减少100元钱。这和数据库是不一样的。例如:
Redis中的锁是采用的乐观锁机制,使用watch命令来监控我关心的key在使用之前是否被改动了,已订票系统为例:
这里只剩下一张票了,李四在买票之前需要监控票的状态,如果在执行watch命令和exec命令之间,正好张三将这张票买走了,如:
这时候李四再提交事务的时候就会什么都不执行。这就是Redis中锁的概念。
watch key1,key2...keyn可以监听多个key。
unwatch命令可以取消当前的所有的监控。