文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

redis事务

2015-05-18 23:16

关注

redis事务

简介

可以一次执行多个命令,本质是一组命令的集合.
一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞

作用

在一个队列中,一次性,顺序性,排他性的执行一系列命令

开启事务示例

remoteSelf:1>multi
"OK"
remoteSelf:1>set k1 v1
"QUEUED"
remoteSelf:1>set k2 v2
"QUEUED"
remoteSelf:1>get k1
"QUEUED"
remoteSelf:1>exec
 1)  "OK"
 2)  "OK"
 3)  "v1"

放弃事务

remoteSelf:1>mget k1 k2
 1)  "v1"
 2)  "v2"
remoteSelf:1>multi
"OK"
remoteSelf:1>set k1 11
"QUEUED"
remoteSelf:1>set k2 22
"QUEUED"
remoteSelf:1>discard
"OK"
remoteSelf:1>mget k1 k2
 1)  "v1"
 2)  "v2"

一个失败所有的都失败(如果打完命令就报错,此时全部回滚)

remoteSelf:1>keys *
 1)  "k2"
 2)  "k1"
 3)  "website"
 4)  "zset01"
remoteSelf:1>multi
"OK"
remoteSelf:1>set k3 v3
"QUEUED"
remoteSelf:1>set k4 v4
"QUEUED"
remoteSelf:1>getset k4
"ERR wrong number of arguments for 'getset' command"
remoteSelf:1>exec
"EXECABORT Transaction discarded because of previous errors."
remoteSelf:1>keys *
 1)  "k2"
 2)  "k1"
 3)  "website"
 4)  "zset01"

一个失败其他的成功(如果打完命令没有报错,进入队列,运行时报错,则其他的运行成功,报错的失败)

remoteSelf:1>keys *
 1)  "k2"
 2)  "k1"
 3)  "website"
 4)  "zset01"
remoteSelf:1>mget k1 k2
 1)  "v1"
 2)  "v2"
remoteSelf:1>multi

"OK"
remoteSelf:1>incr k1
"QUEUED"
remoteSelf:1>set k3 v3
"QUEUED"
remoteSelf:1>exec
 1)  "ERR value is not an integer or out of range"
 2)  "OK"
remoteSelf:1>keys *
 1)  "website"
 2)  "zset01"
 3)  "k1"
 4)  "k2"
 5)  "k3"

watch监控.如果监控的数据发生了改变,则事务失效

悲观锁

pessimistic lock,每次拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,
这样别人想拿这个数据就会block直到拿到锁.
传统的关系型数据库里边就用到了很多这种锁机制,比如行所,表锁等,读锁,写锁等,都是在操作之前先上锁

乐观锁

optimistic lock,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,
可以使用版本号等机制.乐观锁适用于多读的应用类型,这样可以提高吞吐量.

乐观锁策略: 提交版本必须大于记录当前版本才能执行更新

示例

127.0.0.1:8686[1]> mget balance debt
1) "100"
2) "0"
127.0.0.1:8686[1]> watch balance
OK
    # watch之后执行更改balance
    remoteSelf:1>set balance "200"
    "OK"
    remoteSelf:1>get balance
    "200"
127.0.0.1:8686[1]> multi
OK
127.0.0.1:8686[1]> decrby balance 20
QUEUED
127.0.0.1:8686[1]> incrby debt 20
QUEUED
# 执行失败
127.0.0.1:8686[1]> exec
(nil)

watch

watch指令,类似乐观锁,事务提交时,如果key的值已经被别的客户端改变,整个事务队列都不会被执行.

通过watch命令在事务执行之前监控了多个keys,倘若在watch之后有任何key的值发生了变化,
exec命令执行的事务都被放弃,同时返回Nullmulti-bulk应答已通知调用者事务执行失败

exec执行之后会取消对所有key的监控

127.0.0.1:8686[1]> get test
"10"
127.0.0.1:8686[1]> mget balance debt
1) "200"
2) "0"
127.0.0.1:8686[1]> watch balance test
OK
127.0.0.1:8686[1]> multi
OK
    # 另外一个客户端改变balance的值
    remoteSelf:1>set balance "100"
    "OK"
    remoteSelf:1>get balance
    "100"
127.0.0.1:8686[1]> incr balance
QUEUED
127.0.0.1:8686[1]> decr debt
QUEUED
# 执行事务失败
127.0.0.1:8686[1]> exec
(nil)
127.0.0.1:8686[1]> mget balance debt
1) "100"
2) "0"
127.0.0.1:8686[1]> get test
"10"
# 之前已经监控了test不在监控
    # 修改test的值
    remoteSelf:1>set test "20"
    "OK"
    remoteSelf:1>get test
    "20"
127.0.0.1:8686[1]> multi
OK
127.0.0.1:8686[1]> incr test
QUEUED
# 事务执行成功.证明了exec在执行时,会取消对所有key的监控
127.0.0.1:8686[1]> exec
1) (integer) 21

unwatch会取消所有key的监控

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯