Redis学习-4-1 Redis事务
1.Redis中的事务
Redis中的事务不等同于关系型数据库中的事务,其实就是一些命令,保证事务中的命令是正常执行的,没有回滚的概念。
1>multi:标记一个事务的开始,还未开始执行;
2>exec:执行事务块内的所有命令;
3>discard:取消事务中的所有命令执行;
2.Redis中执行的三种情况:
例:1实现正常事务的逻辑:
multi
sadd works john
sadd works rose
smembers works
exec
例:2exec执行之前,命令语法就是错误的,redis可检测到语法的问题
multi
set username lisi
get username
incr k1 k2
exec
此时get username 是nil
语法的有错误的话,整个事务可以放弃取消的
例:3 放入redis中的命令语法没错,执行的时候才会出错的,事务是正常执行的
lindex:是列表类型的命令,lindex string的变量,语法是没问题的,只要执行的时候发生错误
set username zs
multi
set username lisi
get username
lindex k1 2
exec
get username 变更为lisi说明已经执行了
3.watch和unwatch机制
watch:使用watch监视一个或多个key,跟踪key的value修改情况,如果有key的value值在事务exec执行之前被修改了,整个事务取消,保证任意时刻只有一个事务执行
数据竞争的问题:多个用户同一时间修改同一数据的值,redis一秒钟执行8w数据,碰撞几率太小
unwatch:取消命令
watch机制对应的是关系型数据库中的乐观锁概念
例题:
redisA:
set str.lp 10
watch str.lp
multi
set str.lp 30
此时redisB中get str.lp 是10
redisB中set str.lp 100 ==>OK
redisA中exec 返回的是nil 证明未执行这个命令
redisA中get str.lp是100
这是因为redisA在exec执行事务之前,变量str.lp已经做变更,事务执行是取消的
4.Discard命令执行取消事务
set username zhangsan
multi
set username zhangsan01
set username zhangsan02
discard <放弃事务>
get username 就是zhangsan 因为放弃了事务的执行