redis事务
Redis中的事务,multi表示开启一个事务(类似MySQL中的begin),然后执行一系列命令(放入队列中,提交后依次执行),exec提交(类似MySQL中的commit)
原子性:Redis中的事务不满足原子性,如果命令中有错误指令,如自增一个字符串的key,提交事务后,其它正常的语句仍能执行,事务不会回滚
事务中读请求没有意义,返回值用不了,因为此时命令还没真正执行,只是放到了一个队列中,exec提交后才真正执行;而MySQL开启事务后执行指令,那是真正实打实的执行的
既然不能在事务中读(没有意义),那就得在事务外面读,然后开启事务,再进行写操作,但这样无法保证读+写的原子性,可能读完后,事务提交前有其它连接更改了数据,解决方案:
- watch命令,用来盯住一个到多个key,如果这些key在事务期间:
没有被其它客户端修改,exec能成功
被其它客户端修改,exec返回nil
例如:
1 | watch a b // 监视a b |
如果第一条指令到最后一条指令期间,有其它客户端修改了a或b的值,exec不会提交事务,返回nil
- lua脚本(2表示接下来的两个值是key,key后面的是参数,即a和b是key,500是参数)

