Redis 事物、悲观、乐观锁 (详细)
1,概论
事物这东西相信大家都不陌生吧,在学习Spring,Mybatis等框架中,
只要是涉及到数据存储和修改的,都会有事物的存在,
废话就不多说了下面我们来简单的介绍下Redis事物以及锁。
2,Redis事物简介?
Redis 事务可以一次执行多个命令, 并且我们来了解几个重要的知识点:
- 开启事物后,一切命令都会放入队列当中,当执行EXEC以后才会挨个执行。
 - 当执行EXEC命令后,如果队列中有命令出错,那么此队列中的全部命令将不会执行(这里有两种可能),后面会举例介绍。
 - 当事物执行以后,其他客户端提交的命令请求不会插入到事务执行命令序列中。
 
事物执行的三个阶段:
- 开始事务。
 - 命令入队。
 - 执行事务。
 
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 事物、悲观、乐观锁 (详细)的更多相关文章
- 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现
		
1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...
 - php+redis 学习 三 乐观锁
		
<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 实现乐观锁机制 * * @example php ...
 - redis事务和乐观锁
		
1 MULTI/EXEC 执行本事务. MULTI set foo bar get foo set foo hello EXEC 在EXEC执行前,三条命令都放入队列中,然后EXEC触发执行.没有回滚 ...
 - redis的hmset乐观锁的实现
		
1.lua脚本(集成实现了乐观锁,hmset ,expire等) local key=KEYS[1]; local oldVerion=tonumber(ARGV[1]); local seconds ...
 - Redis分布式锁----乐观锁的实现,以秒杀系统为例
		
本文使用redis来实现乐观锁,并以秒杀系统为实例来讲解整个过程. 乐观锁 大多数是基于数据版本(version)的记录机制实现的.即为数据增加一个版本标识,在基于数据库表的版本解决方案中, ...
 - 悲观锁 vs 乐观锁 vs Redis
		
企业面对高并发场景采用的方案. 比如 产品抢购高并发时的超发现象. 1 悲观锁悲观锁 需要数据库本身提供支持(Oracle和MySQL都是支持的).实现细节:当前 数据库事务 读取到产品后, 就将目标 ...
 - redis 事务(悲观锁和乐观锁)
		
MULTI 开启事务,后续的命令会被加入到同一个事务中 事务中的操作会发送给客服端,但是不会立即执行,而是将操作放到了该事务对应的一个队列中,服务端返回QUEQUD EXEC 执行EXEC后,事务中的 ...
 - 基于Django的乐观锁与悲观锁解决订单并发问题的一点浅见
		
订单并发这个问题我想大家都是有一定认识的,这里我说一下我的一些浅见,我会尽可能的让大家了解如何解决这类问题. 在解释如何解决订单并发问题之前,需要先了解一下什么是数据库的事务.(我用的是mysql数据 ...
 - Mysql悲观锁乐观锁区别与使用场景
		
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
 
随机推荐
- java  单利模式设计原理,饿汉式懒汉式,开发中推荐饿汉式
			
单例模式的设计: 1 //Single类进内存,对象还没有存在,只有调用了getInstance方法时,才建立对象. //对象是方法被调用时,才初始化,也叫做对象的延时加载.成为:懒汉式. //Si ...
 - android中shape的使用(android:angle小解)
			
本文参考http://kofi1122.blog.51cto.com/2815761/521605和http://blog.csdn.net/qizi329/article/details/63098 ...
 - Mac系统的SVN客户端:Snail SVN 精简版
			
Mac系统的SVN客户端:Snail SVN 精简版 前言 本人在公司中,使用的是windows操作系统,svn客户端自然也就使用tortoise svn.但自从男朋友给我买了台macbook pro ...
 - winform程序常用图标网站及资源
			
1.easyicon网站,免费下载 https://www.easyicon.net/ 2.findicons https://findicons.com/ 3.iconarchive http:// ...
 - 吴裕雄--天生自然 JAVA开发学习: 循环结构
			
public class Test { public static void main(String args[]) { int x = 10; while( x < 20 ) { System ...
 - c# 之Enum--枚举
			
枚举 收藏的博文连接 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 枚举类型(也称为枚举):该类型可以 ...
 - 5.docker image (镜像)
			
1.image 是什么 是文件和 meta data 的集合 (root filesystem) 是分层的,并且每一层都可以添加改变删除文件,成为一个新的image 不同的image可以共享相同的la ...
 - 数字转中文大写=> 1234=> 一千二百三十四
			
# -*- coding: utf-8 -*- # 最大值:九兆九千九百九十九亿九千九百九十九万九千九百九十九 import re p = ['', '十', '百', '千', '万', '十', ...
 - 关于汽车诊断OBD的理解(ISO15031-5)(转发)
			
1.OBD用来做什么 2.OBD和UDS的区别 3.OBD硬件接口简介 4.OBD的9大模式介绍 OBD(On-Board Diagnostic)指的是在线诊断系统,是汽车上的一种用于监控车辆状况以及 ...
 - 安装 texlive
			
多系统使用texlive 中文latex 用xelatex 编译 只需要加入宏包 \usepackage[UTF8]{ctex} Rmarkdown 配置模版 $ cat _output.yaml b ...