共计 1700 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章主要介绍了 redis 中事务操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。
redis 与 mysql 的事务
Redis 支持简单的事务
简单使用
讲张三的 100 圆钱转账给 lisi:
set zhangsan 800
set lisi 100
multi
decrby zhangsan 100
incrby lisi 100
exec
失败的两种情况
在 mutil 后面的语句中, 语句出错可能有 2 种情况,还是以转账的情况来分析:
(1)语法就有问题
127.0.0.1:6379 multi
127.0.0.1:6379 decrby zhang 100
QUEUED
127.0.0.1:6379 hasdfasdf
(error) ERR unknown command hasdfasdf
127.0.0.1:6379 exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379 mget zhang wang
1) 800
2) 100
这种,exec 时, 报错, 所有语句得不到执行,所以还是 800 和 100 圆
(2)语法本身没错, 但适用对象有问题
127.0.0.1:6379 multi
127.0.0.1:6379 decrby zhang 100
QUEUED
127.0.0.1:6379 sadd wang 1
QUEUED
127.0.0.1:6379 exec
1) (integer) 700
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379 mget zhang wang
1) 700
2) 100
Exec 之后, 会执行正确的语句, 并跳过有不适当的语句,所以这里是一个 700 圆一个 100 圆了
案例
假设买票案例,当前只有 1 张票和 100 块钱,如果我在买票的过程中,在我 multi 之后,和 exec 之前,票被别人买了—即 ticket 已经变成 0 了,然后我们执行 exec 的时候就会将票变为 -1,这就不对了。
127.0.0.1:6379 set ticket 1
127.0.0.1:6379 set money 100
127.0.0.1:6379 multi
127.0.0.1:6379 decr ticket
QUEUED
127.0.0.1:6379 decrby money 10
QUEUED
127.0.0.1:6379 exec
1) (integer) -1
2) (integer) 90
使用 watch 来检测票有没有被买走
实用 watch 来检测指定的 key,负责监测 key 没有被改动。
127.0.0.1:6379 set ticket 1
127.0.0.1:6379 set money 100
127.0.0.1:6379 watch ticket
127.0.0.1:6379 multi
127.0.0.1:6379 decr ticket
QUEUED
127.0.0.1:6379 decrby money 10
QUEUED
127.0.0.1:6379 exec
(nil)// 返回 nil, 说明监视的 ticket 已经改变了, 事务就取消了.
127.0.0.1:6379 mget ticket money
1) 0
2) 100
在执行 exec 之前,票被买走了,ticket 为 0 了,然后执行 exec 后,发现 ticket 被动了,所以就不执行事务了,事务被取消了。在执行 exec 的时候返回 nil。
watch 相关用法
watch key1 key2 ... keyN
作用:监听 key1 key2..keyN 有没有变化, 如果有变, 则事务取消
unwatch
感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“redis 中事务操作的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!