1,概论

      事物这东西相信大家都不陌生吧,在学习Spring,Mybatis等框架中,

      只要是涉及到数据存储和修改的,都会有事物的存在,

      废话就不多说了下面我们来简单的介绍下Redis事物以及锁。


2,Redis事物简介?

    Redis 事务可以一次执行多个命令, 并且我们来了解几个重要的知识点:

  1. 开启事物后,一切命令都会放入队列当中,当执行EXEC以后才会挨个执行。
  2. 当执行EXEC命令后,如果队列中有命令出错,那么此队列中的全部命令将不会执行(这里有两种可能),后面会举例介绍。
  3. 当事物执行以后,其他客户端提交的命令请求不会插入到事务执行命令序列中。

  事物执行的三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

3,Redis事物(Transaction)命令?

DISCARD 取消事务,放弃执行事务块内的所有命令。
EXEC 执行所有事务块内的命令。
MULTI 开启事物
UNWATCH 取消 WATCH 命令对所有 key 的监视。
WATCH key 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

4,Redis事物使用?

  下面我们来通过几个例子认识下

  1.正常执行

  

  2.放弃事物

     放弃事物,队列里面的命令将不会执行。

  

 3.全体连坐

   一个命令出错,队列中的全部命令将不会执行。

  

  

  4.冤头债主

    这个例子跟上面的差不多,只不过这个例子是执行了以后再报错,他两不同的地方就是

    上面是先知道错误,这个是执行后才知道错误了,举个例子吧,

    比如 我要让我的Redis数据数值增一操作,我在控制台执行命令,INCR key 当事物还没执行的时候,

    也就是说这个命令还在队列中,还没执行,它是不知道我这个key到底是个数值还是个字符串,

    假设key不是个数值类型那么当执行事物后,这条命令将会报错,其他的命令正常执行。

    

  5.WATCH监控

      在了解WATCH监控前我们先来聊聊乐观锁和悲欢锁,

   ①悲观锁:我很悲观,我觉得我每次去拿数据的时候都会被人修改,所以我每次拿数据的时候我就会上锁,

       别人想拿这个数据的时候就会block,直到别人拿到锁。传统的关系型数据库里面就会用到很多这种机制,

       比如 行锁,表锁,读锁,写锁等,都是在操作前加上锁,防止多人修改同一条数据。这样的话就成功提高了数据的一致性,降低了并发性。

   ②乐观锁:我很乐观,我觉得我每次去拿数据的时候别人都不会修改,所以不会上锁,但是我在更新数据的时候,

        我就会判断一下,有没有别人去更新这个数据,这里我们可以使用版本号等机制来实现判断。

        乐观锁适用于多读的应用类型,这样可以提高吞吐量和并发性。

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

   下面来看看WATCH怎么使用的

  一,无加塞篡改

    我这里就拿个花呗额度来举例,假设我的balance为余额,arrears为欠下的余额,下面这张图为

    无加塞篡改,先监控在开启multi,保证两笔金额变动在同一事物内,一起执行。

    

  二,有加塞篡改

      类似于我在修改这个数据的时候,被其他用户已经修改了,已经被加上锁了,我自己就修改不了了,要等被人修改完才能够修改,这跟上面的乐观锁很相似,

        我开启两个控制台,一个用来正常操作,一个用来中途篡改数据。

      WATCH 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

      下面我们来看图.

      

我还没执行这些命令之前我根本不知道我的数据已经在被人修改了,当我要修改数据的时候已经被人先改了。

这时候我们UNWATCH命令就派上用场了,相当于当我修改数据的时候我就把锁加上,修改完成后就把锁解开,让下一个人继续修改数据,

取消 WATCH 命令对所有 key 的监视,一旦我们执行EXEC以后所有监控锁都会被取消掉。

下面我们来看图


  5,结尾

      后面还会更新如何使用RedisTemplate来操作Redis命令,如何解决Redis穿透/雪崩等。

      文章就写到这里了,如果文章有需要改进的地方请大佬们在评论区里留言,谢谢点评。

Redis 事物、悲观、乐观锁 (详细)的更多相关文章

  1. 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现

    1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...

  2. php+redis 学习 三 乐观锁

    <?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现乐观锁机制 * * @example php ...

  3. redis事务和乐观锁

    1 MULTI/EXEC 执行本事务. MULTI set foo bar get foo set foo hello EXEC 在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行.没有回滚 ...

  4. redis的hmset乐观锁的实现

    1.lua脚本(集成实现了乐观锁,hmset ,expire等) local key=KEYS[1]; local oldVerion=tonumber(ARGV[1]); local seconds ...

  5. Redis分布式锁----乐观锁的实现,以秒杀系统为例

    本文使用redis来实现乐观锁,并以秒杀系统为实例来讲解整个过程. 乐观锁      大多数是基于数据版本(version)的记录机制实现的.即为数据增加一个版本标识,在基于数据库表的版本解决方案中, ...

  6. 悲观锁 vs 乐观锁 vs Redis

    企业面对高并发场景采用的方案. 比如 产品抢购高并发时的超发现象. 1 悲观锁悲观锁 需要数据库本身提供支持(Oracle和MySQL都是支持的).实现细节:当前 数据库事务 读取到产品后, 就将目标 ...

  7. redis 事务(悲观锁和乐观锁)

    MULTI 开启事务,后续的命令会被加入到同一个事务中 事务中的操作会发送给客服端,但是不会立即执行,而是将操作放到了该事务对应的一个队列中,服务端返回QUEQUD EXEC 执行EXEC后,事务中的 ...

  8. 基于Django的乐观锁与悲观锁解决订单并发问题的一点浅见

    订单并发这个问题我想大家都是有一定认识的,这里我说一下我的一些浅见,我会尽可能的让大家了解如何解决这类问题. 在解释如何解决订单并发问题之前,需要先了解一下什么是数据库的事务.(我用的是mysql数据 ...

  9. Mysql悲观锁乐观锁区别与使用场景

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

随机推荐

  1. 20.docker 持久化存储与数据共享

    1.image layer 和 container layer 的关系 image layer 是可读的 container layer 是在image layer 之上创建的 一个可读可写层 con ...

  2. Cannot find tomcat目录/bin/setclasspath.sh This file is needed to run this program

    首先如果直接使用 root 用户来启动 tomcat 的话,是可以正常启动的. 但是我们在 Linux 中使用普通用户启动 tomcat 报了如下错误 Cannot find /developer/a ...

  3. MBProgressHUD覆盖键盘

    发送消息的时候,需要用MBProgressHUD来覆盖窗口等待发送成功,但是无论如何键盘都覆盖不上. 于是各种研究,添加到view,添加到window,都无果..想破了脑子,总觉得加到window都覆 ...

  4. 编程作业2.2:Regularized Logistic regression

    题目 在本部分的练习中,您将使用正则化的Logistic回归模型来预测一个制造工厂的微芯片是否通过质量保证(QA),在QA过程中,每个芯片都会经过各种测试来保证它可以正常运行.假设你是这个工厂的产品经 ...

  5. 一文详解 Java 的八大基本类型

    自从Java发布以来,基本数据类型就是Java语言中重要的一部分,本文就来详细介绍下每种基本类型的具体使用方法和限制. 作者 | Jeremy Grifski 译者 | 弯月,责编 | 郭芮 出品 | ...

  6. JKFZ%你赛炸裂祭

    Md爆40了身败名裂 上来就刚T1是什么习惯?居然不看T2导致明明能刚出正解却止步40 , T3找到原题看懂题解后却不敢交+难码 , 最近怕不是做毒瘤%你赛多了总以为T1能刚到点分 md最近怕不是炸了 ...

  7. 论文或github中一些通用思想

    (1) 云从 上海交大 ECCV2018 http://openaccess.thecvf.com/content_ECCV_2018/papers/Yao_Feng_Joint_3D_Face_EC ...

  8. CodeForces 992C Nastya and a Wardrobe(规律、快速幂)

    http://codeforces.com/problemset/problem/992/C 题意: 给你两个数x,k,k代表有k+1个月,x每个月可以增长一倍,增长后的下一个月开始时x有50%几率减 ...

  9. Java之多线程方式二(实现Runnable接口)

    /** * 创建多线程的方式二:实现Runnable接口 * 1. 创建一个实现了Runnable接口的类 * 2. 实现类去实现Runnable中的抽象方法:run() * 3. 创建实现类的对象 ...

  10. 蓝桥杯练习Day 2

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...