redis事务的特性
- 不同的客户端之间的事务不会互相阻碍;
- 事务是一个原子操作,要么全部执行,要么全部都不执行,没有中间状态;
- redis的事务不支持回滚;作者认为,程序失败是由编程错误造成的,而这些错误应该在开发的时候就被发现;还有一点是redis不支持事务可以保证简单且快速;所以,在未提交的情况,不会更新key值!
redis事务和mysql事务的区别
redis的事务没有mysql的事务那么完整;
mysql的事务是为了保证最终一致性的,所以在修改数据时会加锁;
redis因为是单进程的,它为了保证速度,不会加锁,谁最后提交就以谁为主;最先提交的那个会被最后提交的覆盖掉;
使用
# 开启事务
multi
# 在开启事务和提交事务中间的代码都会进入到redis 的队列里面;当你执行exec提交后,redis会将队列里面的名字依次执行;
# 事务操作命令...
# 提交事务
exec
redis事务的执行原理
redis事务的本质其实是将命令存储在一个队列里面,当执行exec
命令提交后按依次执行队列中的命令
127.0.0.1:6379> MULTI // 开启事务
OK
127.0.0.1:6379> set key1 hello
QUEUED # 第一个命令加入到了队列中
127.0.0.1:6379> keys *
QUEUED # 第二个命令加入到了队列中
127.0.0.1:6379> exec // 提交
1) OK # 第一个命令的执行结果
2) 1) "sumkey1" # 第二个命令的执行结果
2) "key1"
3) "k2"
4) "sumkey"
5) "sumkey2"
6) "k1"
wathc
命令实现乐观锁
WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。
被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。
watch k1 # 开启监听
multi # 开启事务
get k1 # 第一个命令
keys * # 第二个命令
exec # 提交,在提交之前,如果有其他的客户端修改了k1的值,那么这个事务就会失效;执行exec后会返回`(nil)`表示事务失败了;