redis中事务操作的示例分析

30次阅读
没有评论

共计 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 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计1700字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)