我的编程空间,编程开发者的网络收藏夹
学习永远不晚

redis事务

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

redis事务

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

redis事务

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis事务

简介可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不许加塞作用在一个队列中,一次性,顺序性,排他性的执行一系列命令开启事务示例remoteSelf:1>multi"OK"remoteSelf
redis事务
2015-05-18
2023-09-08

redis 实战-redis 事务

redis 实战-redis 事务  1.描述    redis 事务单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送过来的命令请求所打断。   redis 事务没有隔离级别的概念:队列中的命令没有提交之前都不会实
redis 实战-redis 事务
2021-02-21

Redis系列(九):Redis的事务机制

提到事务,相信大家都不陌生,事务的ACID四大特性,也是面试时经常问的,不过一般情况下,我们可能想到的是传统关系型数据库的事务,其实,Redis也是提供了事务机制的,本篇博客就来讲解下Redis的事务机制。1. 事务演示Redis的事务提供了一种将多个命令请求
Redis系列(九):Redis的事务机制
2016-07-18

你了解Redis事务吗

说到事务,大家会立刻想到Mysql的事务,所谓的事务就是对数据进行一系列的操作,要么都执行成功,要么都执行失败,下面就介绍一下Redis如何实现事务,感兴趣的可以了解一下
2022-11-13

redis事务如何处理

redis 事务处理Redis 事务是一种命令分组,这些命令要么全部执行,要么全部不执行。它确保原子性、一致性、隔离性和持久性(ACID)属性,即使在并发情况下也是如此。事务的运作方式:启动事务:使用 MULTI 命令启动事务。记录命令
redis事务如何处理
2024-06-12

redis 分布式缓存实战-redis 事务

redis 分布式缓存实战-redis 事务  1.描述   redis 事务单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端发送过来的命令请求所打断。  redis 事务没有隔离级别的概念:队列中的命令没有提交之前都
redis 分布式缓存实战-redis 事务
2017-03-11

Redis教程(八):事务详解

一、概述:和众多其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULTI/EXEC/DISCARD/WATCH这四个命令是我们实现事务的基石。相信对有关系型数据库开发经验的开发者而言这一概念并不陌生,即
2022-06-04

编程热搜

目录