之前在某个公众号下看到老钱的一篇文章,题目是《十个常见的Redis面试“刁难”问题》,感觉写的很好,不过里面的解答对于我这种小白来说并不是很全面,所以在这里实际操作、思考一番,并把自己的所得简单记录下来。
原文参考:https://mp.weixin.qq.com/s/Z4a8wbWvPDGFTkKJH0X9VQ
Redis的事务了解吗?
MULTI,EXEC操作:事务的开始和结束标记
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 1
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
127.0.0.1:6379> get k1
"1"
127.0.0.1:6379> get k2
"1"
127.0.0.1:6379>
执行Multi命令,redis反馈ok表示开始事务;执行EXEC命令,结束事务,开始顺序执行事务中的操作。
错误处理
语法错误:执行命令不存在或参数不对,都是语法错误,只有事务中有一处错误,redis执行exec命令后,会直接返回错误,正确的命令也不会被执行。 — 下面例子是输错命令了,所以全部都不执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set sex nan
QUEUED
127.0.0.1:6379> ssas aget 1
(error) ERR unknown command 'ssas'
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
运行错误:此类错误执行命令没错,但是操作对应的键有误,会造成运行时才会发现的错误,但是不影响其它正确命令的执行。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k 10
QUEUED
127.0.0.1:6379> sadd k 20
QUEUED
127.0.0.1:6379> set k 200
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get k
"200"
127.0.0.1:6379>
这种运行时错误,可以看到,不影响整体的执行
WATCH命令
监控指定键,若被监控的键在以下事务执行前被修改,则包含对此键有操作动作的事务不执行,返回nil。
127.0.0.1:6379> set k 30
OK
127.0.0.1:6379> get k
"30"
127.0.0.1:6379>
127.0.0.1:6379> watch k
OK
127.0.0.1:6379> set k 40
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k 50
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get k
"40"
127.0.0.1:6379>
可以看到,如果watch的key在事务执行前被修改了,事务就不会执行,exec返回的是nil,key对应的value也不修改,依然是事务之外设置的值。