redis事务

Redis中的事务,multi表示开启一个事务(类似MySQL中的begin),然后执行一系列命令(放入队列中,提交后依次执行),exec提交(类似MySQL中的commit)

原子性:Redis中的事务不满足原子性,如果命令中有错误指令,如自增一个字符串的key,提交事务后,其它正常的语句仍能执行,事务不会回滚

事务中读请求没有意义,返回值用不了,因为此时命令还没真正执行,只是放到了一个队列中,exec提交后才真正执行;而MySQL开启事务后执行指令,那是真正实打实的执行的

既然不能在事务中读(没有意义),那就得在事务外面读,然后开启事务,再进行写操作,但这样无法保证读+写的原子性,可能读完后,事务提交前有其它连接更改了数据,解决方案:

  • watch命令,用来盯住一个到多个key,如果这些key在事务期间:

没有被其它客户端修改,exec能成功

被其它客户端修改,exec返回nil

例如:

1
2
3
4
5
6
watch a b // 监视a b 
get a // 返回1000
get b // 返回500
multi // 开启事务
set a 500, set b 1000 // a给b转账500
exec

如果第一条指令到最后一条指令期间,有其它客户端修改了a或b的值,exec不会提交事务,返回nil

  • lua脚本(2表示接下来的两个值是key,key后面的是参数,即a和b是key,500是参数)