当前位置: 首页 > 编程日记 > 正文

Redis初学:14(Redis中的事务)

Redis中的事务

Redis的事务定义

Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。

Redis中的事务操作Multi、Exec、discard

从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。组队的过程中可以通过discard来放弃组队。
在这里插入图片描述

事务的错误处理

案例:
1.组队成功,提交成功,如下图:
在这里插入图片描述
2.组队阶段语法错误,提交失败事务不进行回滚,如下图:
在这里插入图片描述
在开启事务之后,将key1的值从value1修改成value11,key2改成value22,key3改成value33,但由于key2处语法错误,导致事务提交失败,key1、key2和key3保持原值。

3.在组队阶段出现运行时错误,事务并没有进行回滚,而是跳过错误内容继续执行,如下图:
在这里插入图片描述
在开启事务之后,将key1的值从value1修改成value11,key2改成value22,key3改成value33,但将key2的类型作为List,在运行时检测类型错误,最终导致事务提交失败。此时事务并没有回滚,而是跳过错误命令继续执行, 结果key1和key3的值改变、key2保留原值。

4.使用discard命令取消组队,如下图:
在这里插入图片描述
在上图中开启事务之后,执行了一系列的操作后使用discard命令,放弃组队,前面的操作都没有执行。

综上,我们可以得出下列结论
1.组队中某个命令出现了报告错误(语法错误、编译错误),执行时整个的所有队列都会被取消,如下图:在这里插入图片描述
2.如果执行阶段某个命令报出了错误(运行时错误),则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚,如下图:
在这里插入图片描述

事务冲突问题

悲观锁

在这里插入图片描述
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

悲观锁主要分为共享锁和排他锁:
**共享锁(shared locks)**又称为读锁,简称 S 锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
**排他锁(exclusive locks)**又称为写锁,简称 X 锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁。获取排他锁的事务可以对数据行读取和修改。

乐观锁

在这里插入图片描述
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

乐观锁的实现:
1.CAS 实现:Java 中java.util.concurrent.atomic包下面的原子变量使用了乐观锁的一种 CAS 实现方式。
2.版本号控制:一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会 +1。当线程 A 要更新数据时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值与当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功。

Redis中的事务冲突问题解决

watch

使用:

watch key1 key2 ...

在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些)key 被其他命令所改动,那么事务将被打断。

例:
我在两个不同的终端进行操作示范
终端1:
在这里插入图片描述
终端2:
在这里插入图片描述
上图中终端1和终端2的执行过程几乎是一致的,都是从watch开始执行,但是终端2执行exec命令时表示执行失败,这是因为终端1先与终端2执行了对balance的修改操作,导致终端2的事务被打断了。

unwatch

使用:

unwatch key1 key2 ...

取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后,EXEC 命令或DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。

Redis事务的三大特性

  • 单独的隔离操作
    事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 没有隔离级别的概念
    队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
  • 不保证原子性
    事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

相关文章:

接口两种实现方式

以前在用到接口时,从来没注意到接口分为隐式实现与显示实现。昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习。 通俗的来讲,“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实…

Android程序如何在代码中改变图片原有的颜色

最近一边找工作一边完善之前的项目。之前安卓初中级的项目是模仿酷狗音乐播放器的。下载一个apk文件,改后缀,解压,然后根据官方应用的布局,用得到的图片照着做出来。记得酷狗首页有好几种主要图标,解压后得到的白色加透…

“error : unknown filesystem”的解决办法

解决方法如下:1:首先使用ls命令显示出ubuntu分区的安装信息: 1 grub rescue>ls 一般会罗列出所有磁盘的分区信息,比如(hd0,msdos1)(hd0,msdos2)(hd0,msdos4)&#xff…

Blender创建三维教室场景学习教程 3D Classroom Environment Creation in Blender

流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,48.0 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.73 GB 含课程文件 |时长:4h 1m 从头到尾在Blender中创建一个完整的3D教室环境,在…

Redis初学16:主从复制

主从复制 简介 主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主,如下图: 好处: 1.读写分离,性能扩展 2.容灾快速恢复 搭建 我这里准备了三…

UITableView数据的添加、删除、移动

数据的添加、删除4个步骤:1、现在导航视图上面添加一个按钮,可以是系统自带的编辑按钮editButtonItem2、实现方法让将要执行删除添加操作的表视图处于编辑状态3、指定表视图中哪些行可以处于编辑状态,默认所有行都可以进行编辑4、指定编辑样式…

Saltstack 用户管理

最近测试组来了一大波,最为公司测试那必须要有qa环境,测试组老大跟我关系很好,他们组不少人对Linux也很了解,平时弄个东西啥的也能自己搞定,软磨硬泡加上最近真的很忙给他们配置了jenkins和开了qa环境用户权限&#xf…

ubuntu 14.04 双显卡安装NVIDIA GPU驱动+CUDA+编译配置caffe

******************************** 安装ubuntu************************* 1.在bios里设置使用集成显卡 2.安装ubuntu 14.04,不要联网安装,否则很慢 *********************************安装 GPU驱动********************** 3.去NVIDIA官网下载run格式…

虚幻引擎虚拟现实开发基础学习教程

流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了解如何使用Oculus Quest 2的蓝图在虚幻引擎4中从头开始构建基本的虚拟…

更换AppleWWDRCA.cer证书

从2月14号开始,上传AppStore时可能会碰到这个问题: Failed to locate or generate matching signing assets Xcode attempted to locate or generate matching signing assets and failed to do so because of the following issues. Missing iOS Distri…

Redis初学17:集群

集群 简介 Redis 集群实现了对Redis的水平扩容,即启动 N 个 redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N 。 Redis 集群通过分区(partition)来提供一定程度的可用性(avail…

怒刷web前端笔试面试题(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.有这么一段HTML&#xff0c;请挑毛病&#xff1a; <P> 哥写的不是HTML&#xff0c;是寂寞。<br><br> 我说&#xff1a;<br>不要迷恋哥&#xff0c;哥只是一个传说 考点1&#xff1a;html和 …

libcudart.so.6.5 cannot open shared object file: no such file or directory

在matlab中运行程序是可能出现libcudart.so.6.5 libcublas.so.6.5 libcurand.so.6.5 等一系列libcu*.so.版本号 找不到的问题。 解决方案是在/usr/local/cuda-版本号/ 目录下搜索到程序找不到的那个文件&#xff0c;然后做一个软连接到matlab目录。 以找不到libcudart.so.6.…

Python中完整的机器学习数据科学课程

学习每个机器学习模型背后的数学&#xff0c;然后用Python实现它 你会学到: 开发机器学习模型 创建机器学习模型的模板 学习每个机器学习模型背后的数学 要求: Python或任何编程语言的基础 时长:8h 15m |视频:. MP4&#xff0c;1280720 30 fps |音频:AAC&#xff0c;44.1 kHz…

Android 高清加载巨图方案 拒绝压缩图片

Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/49300989&#xff1b; 本文出自:【张鸿洋的博客】 一、概述 距离上一篇博客有段时间没更新了&#xff0c;主要是最近有些私事导致的&#xff0c;那么就先…

Docker初学1:初识Docker

前言&#xff1a;本博客内容是对【狂神说Java】中的Docker教程学习过程中的记录与总结 Docker的历史 Docker公司 Docker 公司位于旧金山&#xff0c;由法裔美籍开发者和企业家 Solumon Hykes 创立&#xff0c;其标志如下图所示。 Docker 公司起初是一家名为 dotCloud 的平台即…

Cstring的使用

https://msdn.microsoft.com/zh-cn/aa315043 1、字符串提取函数&#xff0c;CString::Left、CString::Mid 、CString::Right CString::Mid CString Mid( int nFirst ) const; throw( CMemoryException ); CString Mid( int nFirst, int nCount ) const; throw( CMemoryExcepti…

facebook maskrcnn 安装笔记

当前版本的maskrcnn严重依赖pythorch_nightly 1.0.0, 安装过程中一不留神会由于各个包之间不兼容导致no module named maskrcnn_benchmark. 注意以下三点即可&#xff1a; 1. 先安装ipython 2. 再单独安装torchvision。 conda install torchvision 3. 最后本地安装pytorch-…

Python完全学习大师班

面向所有人的Python:基础、中级和高级概念学习制作游戏和实时应用程序 你会学到: 从头开始学习Python 学习中级和高级概念 学习用Python制作实时应用程序 学习用Python制作游戏 要求 不需要编程经验:你将从头开始学习课程中的所有内容 MP4 |视频:h264&#xff0c;1280720 |音…

Docker初学2:Docker的安装

Docker的安装 Docker的架构图 我们先来介绍一下上面这张Docker架构图 镜像&#xff08;image&#xff09;&#xff1a; Docker 镜像&#xff08;Image&#xff09;就是一个只读的模板。镜像可以用来创建 Docker 容器&#xff0c;一个镜像可以创建很多容器。 就好似 Java 中的…

[ME]不知道第几次学c语言,仍觉得水深莫测

首先声明这篇东西是个人的碎碎念&#xff0c;没有任何干货。 接下c语言课助教的活儿时还没什么感觉&#xff0c;快要开学了&#xff0c;才感觉到紧张&#xff0c;逼着自己开始看老师发来的课件&#xff0c;说是查错&#xff0c;其实算是自己再好好学一遍&#xff0c;免得到时候…

MYSQL 主从复制 --- binlog

在 Master 端并不 Care 有多少个 Slave 连上了自己,只要有 Slave 的 IO 线程通过了连接认证,向他请求指定位置之后的 Binary Log 信息,他就会按照该 IO 线程的要求,读取自己的 Binary Log 信息,返回给 Slave 的 IO 线程。默认MySQL是未开启该日志的。如果读压力加大,就需要更多的 slave 来解决,但是如果slave的复制全部从 master 复制,势必会加大 master 的复制IO的压力,所以就出现了级联复制,减轻 master 压力。

深入理解Oracle RAC 12c 笔记

深入理解Oracle RAC 12c 跳转至&#xff1a; 导航、 搜索文件夹 1 概述2 集群件管理和故障诊断3 执行实践4 新特性5 存储和ASM6 应用设计上的问题7 管理和调优一个复杂的RAC环境8 备份与恢复9 网络实践10 优化RAC数据库11 锁与死锁12 并行查询13 集群件和数据库升级14 RAC One …

MySQL 中 is null 和 =null 的区别

如果 set ANSI_NULLS为 ON 时,表示SQL语句遵循SQL-92标准;如果 set ANSI_NULLS 为 OFF 时,表示不遵从 SQL-92 标准。但SQL-92 标准要求对null的 = 或不等于 (!= ,) 比较取值都为 false,也就是 =null 或者 null,返回的都是false。null 在MySQL中不代表任何值,通过运算符是得不到任何结果的,因此只能用 is null(默认情况)MySQL 中 null 不代表任务实际的值,类似于一个未知数。

Back Propagation Nerual Networks

1 BP神经网络的优缺点及优化 1.1 BP神经网络的优点 由于预测的随机性和不确定性&#xff0c;传统的回归分析、数理统计等方法往往难以达到理想的预测效果。BP神经网络(Back一Propagation Network&#xff0c;BP)是人工神经网络(Artificial Neural Network&#xff0c;ANN)中应…

OpenCV和Python动手操作计算机视觉学习教程

使用OpenCV和Python进行实际操作 面向初学者的OpenCV Python动手操作计算机视觉 你会学到: NumPy基础知识 基于OpenCV的人脸检测 使用OpenCV在图像和视频上绘制形状 使用OpenCV进行平滑、模糊、阈值和形态学操作 基于OpenCV的目标跟踪 带有OpenCV的直方图 使用OpenCV查找车道线…

Docker初学3:Docker的常用命令

Docker的常用命令 帮助命令 帮助命令可以在我们遇到不懂的命令时帮助我们去了解它们怎么使用。 docker version # 显示 Docker 版本信息。 docker info # 显示 Docker 系统信息&#xff0c;包括镜像和容器数。。 docker --help # 帮助镜像命令 docker images doc…

fastJson的使用

Movie MovieJSON.parseObject(result, Movie.class); Toast.makeText(MainActivity.this, Movie.getDir()Movie.getNm()Movie.getPhotos().size(), 0).show(); 对于jsonArray,也就是先得到具体的某一个jsonarray,然后parseArray. JSONObject object new JSONObject(arg0); …

【C#】ASP.NET网页中添加单点登录功能

背景 首先&#xff0c;要说明的是&#xff0c;原先需求定义的是&#xff0c;同一个账号只能同时有一个人来登录&#xff0c;如果另外一个登录的话&#xff0c;前一个登陆者就自动被踢掉。本来原先要做成存储到服务器的数据库中&#xff0c;但是后来如果是非正常退出的话 下次就…

基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV

实现12种不同的算法来跟踪视频和网络摄像头中的对象&#xff01; 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区别 要求 程序设计逻辑 基本Python编程 MP4 |视频:h264&#xff0c;128…