美文网首页
01给女朋友讲讲Redis-事务

01给女朋友讲讲Redis-事务

作者: XueFengDong | 来源:发表于2021-07-02 13:12 被阅读0次

一、Redis事务的本质

一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。

------头部 -> set -> set -> set -> 尾部------

特性:

  • 一次性
  • 顺序性
  • 排他性

Redis事务没有隔离级别的概念。
Redis单条指令是保证原子性的,但是事务不保证原子性。

二、Redis事务实践

主要命令如下:

  • MULTI ->开启事务
  • EXEC ->执行事务
  • DISCARD ->放弃事务

执行效果如下所示
1.正常执行事务

127.0.0.1:6379> MULTI #开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> get k2
QUEUED
127.0.0.1:6379> EXEC #执行事务
1) OK
2) OK
3) "v1"
4) "v2"
127.0.0.1:6379>

2.放弃当前事务

127.0.0.1:6379> MULTI #开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> DISCARD #放弃事务
OK
127.0.0.1:6379> get k1 #事务已经被放弃,不会取到值
(nil)
127.0.0.1:6379> get k2
(nil)

3.编译时发生错误
当事务开启之后,多条命令中包含一条不存在的命令,本次事务会全部放弃。

127.0.0.1:6379> MULTI #开启事务
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> setget k2 v2 #此处故意输入错误命令,编译时已经报错
(error) ERR unknown command `setget`, with args beginning with: `k2`, `v2`, 
127.0.0.1:6379> EXEC #执行事务,事务全部放弃,不会成功
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k1 #没有取到编译错误之前设置的值
(nil)

4.执行时发生错误
当事务开启之后,某些命令执行了不合理的操作,那么该命令不会生效,但不影响本次事务中其他命令的执行。

127.0.0.1:6379> set k1 wuhan
OK
127.0.0.1:6379> get k1
"wuhan"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k2 shanghai
QUEUED
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> set k3 beijing
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) ERR value is not an integer or out of range #此处k1不是数字,执行incr会报错
3) OK
127.0.0.1:6379> get k1
"wuhan"
127.0.0.1:6379> get k2 #虽然执行命令INCR k1时出错,没有影响其余正常命令的执行
"shanghai"
127.0.0.1:6379> get k3
"beijing"

三、Redis实现乐观锁

乐观锁

  • 做事很乐观,认为什么时候都不会出问题,所以不会真正上锁。在更新数据的时候去判断一下,在此期间内是否有人修改过数据。
  • 获取version
  • 更新的时候比较version
    Redis中如何实现?
WATCH key [key ...]

在操作之前监视指定的key,如果事务执行期间被别的线程修改过,那么整个事务将会失效。
线程1:

127.0.0.1:6379> set money 1000 #假设账户有1000元
OK
127.0.0.1:6379> WATCH money #取之前先监视key
OK
127.0.0.1:6379> MULTI #开启事务
OK
127.0.0.1:6379(TX)> DECRBY money 500 #取500
QUEUED
127.0.0.1:6379(TX)> EXEC #执行事务,返回结果为(nil),代表事务执行失败
(nil)
127.0.0.1:6379> get money #查看金额已经发生变动
"600"

线程2:

127.0.0.1:6379> get money #账户起始金额为1000
"1000"
127.0.0.1:6379> DECRBY money 400 #取400,余额为600
(integer) 600

相关文章

  • 01给女朋友讲讲Redis-事务

    一、Redis事务的本质 一组命令的集合,一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。 特...

  • 04给女朋友讲讲Redis-发布订阅

    一、Redis发布订阅介绍 Redis发布订阅(pub/sub)是一种消息通信模式:发布者(pub)发送消息,订阅...

  • 03给女朋友讲讲Redis-持久化机制

    为了防止数据丢失以及服务重启时能够恢复数据,Redis提供了两种主要的持久化机制,RDB和AOF。 一、RDB R...

  • 05给女朋友讲讲Redis-集群搭建(哨兵模式)

    一、Redis安装 准备三台主机,分别安装Redis(本文以redis6.0.6为例)我这里: 10.27.3.1...

  • redis-事务

    简述:  redis 通过 multi 事务开始 exec 执行 watch 乐观锁 discard 取消事务等命...

  • redis-事务

    redis事务 Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务...

  • Redis-事务

    Redis事务: 在一个队列(queue)中依次执行一系列的命令。 事务的三个阶段: 1.开始事务(MULTI)2...

  • redis-事务

    mysql事务: 多个sql操作,要么一起成功要么一起失败 redis命令都是原子性的,一个命令执行时要么成功要么...

  • 01给女朋友讲讲rabbitmq-安装与简述

    一、AMQP协议 高级消息队列协议,一种约定俗成的规范。主要适用的消息中间件为RabbitMq、ActiveMq。...

  • 01给女朋友讲讲并发编程-基础知识

    一、进程与线程 1.进程 程序是由指令和数据组成。但是这些指令要运行,就需要将指令加载进内CPU,数据加载至内存。...

网友评论

      本文标题:01给女朋友讲讲Redis-事务

      本文链接:https://www.haomeiwen.com/subject/owstyltx.html