Redis:事务

Redis:事务

    • 事务
    • 事务操作
      • MULTI & EXEC
      • DISCARD
      • WATCH


事务

MySQL中,事务遵循CIRD特性:

  1. 原子性:事务是一个整体,要么没有发生,要么已经执行完毕
  2. 一致性:事务执行前后,数据都要符合业务要求
  3. 隔离性:事务并发时,各个事务之间的可见性受到一定限制
  4. 持久性:事务做出的修改会被存储到硬盘中持久化

由于MySQL是支持并发的,所以MySQL的事务机制非常复杂,要考虑很多情况。但是Redis不同,作为一个单线程模型的数据库,Redis根本就没有并发问题,所以Redis的事务机制会简单很多。

Redis的事务特点如下:

  • 弱化原子性:在Redis中,没有回滚机制,不能做到事务中一个命令出错,回滚到事务开始前,简单理解来说,Redis的事务就是一个简单的打包执行
  • 无需隔离性:由于Redis是单线程模型,不会出现并发,不会有多个事务同时进行,所以不需要隔离性
  • 无需持久性Redis是内存级别的数据库,虽然有持久化机制,但是事务执行完毕后,不能保证数据被写入硬盘
  • 不保证一致性:在MySQL中,一致性是通过前三个特性都满足进而达成的,很不巧Redis都不满足,自然也就不能保证一致性了

既然如此,Redis的事务有啥用?

其实Redis的事务就像一个简单的打包,保证一个事务内部的指令是连续执行的。就像在排队时,几个好朋友总要连着站在一起,不让别人插在中间。

假设排队的时候,先到了几个人,还有几个人没来,此时如果占着排队的位置,让后来的朋友直接插入,貌似有点不道德了。所以一种处理策略是,在朋友到来之前,让后面的人排到前面去,等到朋友来了,几个人再一起插入队尾。

也就是说,Redis的事务策略,不是先抢占位置,而是先空出位置给别的事务,等到自己一个事务内部的所有操作都齐全了,再一起执行。


事务操作

MULTI & EXEC

  • multi:开启事务
  • exec:提交事务

示例:

在这里插入图片描述

开启事务后,不论输入什么指令,都返回QUEUE,此时会在客户端维护一个队列,将所有指令入队列。最后执行exec提交事务,所有的指令再同时返回。


DISCARD

  • discard:取消事务

示例:

在这里插入图片描述

开启事务后,输入两个值,再通过discard取消事务,最后查询key1,发现插入失败,因为这个请求没有提交给客户端,而是直接被取消了。

另外的,如果在事务执行的过程中,Redis崩溃,恢复后效果和discard一样,就是事务内的操作都取消了。


WATCH

现有以下场景:

序号客户端1客户端2
1multi
2set key 111
3set key 222
4exec
5get key

最后客户端get key返回值是多少?

这是一个很常见的事务问题,虽然客户端1执行set key更早,但是它提交事务更晚,最终客户端的结果其实是111

在这里插入图片描述

在事务执行过程中,客户端1无法感知外部的变化,导致客户端2拿不到自己想要的数据,被其他事务覆盖了。

  • watch:让事务可以监听外部的变化,如果监听的数据被外部改变,操作失效

语法:

watch key [key ...]

示例:

在这里插入图片描述

左侧的终端,在执行事务前开启了watch key1,开启事务后set key1 111。在事务提交前,右侧终端修改了key1 222,随后左侧终端提交事务时,返回了nil表示事务操作无效。

因为watch监听到了key1被外部修改,此时自己的事务提交可能会影响其它客户端,于是取消该操作。

如果想要取消watch,可以使用unwatch指令:

unwatch

这个指令没有参数,一次性取消所有key的监听。

watch使用了一种版本号的机制,每个数据都有一个版本号,每次修改key的值时,都会修改其版本号。在watch key时,会记录当前的版本号。在事务提交时,检测当前的版本号是否与之前的版本号相同,如果相同那么提交成功,如果版本号不同,说明有别的用户修改了数据,导致版本号修改,事务就直接被丢弃了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442313.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Arduino的遥控自平衡小车

基于Arduino的遥控自平衡小车 一、项目简介二、所需材料三、理论支持四、外壳设计五、线路连接六、检查MPU6050连接七、烧录库八、PID控制设置九、设置传感器参数十、无线移动控制十一、超声波模块 一、项目简介 一个使用Arduino Nano、MPU-6050以及便宜的6伏直流齿轮电机的自…

活久见!2024年诺贝尔物理学奖颁给了AI大佬Hinton 和 Hopfield

家人们!让我们暂停手中工作,庆祝AI届的科学家首次获得诺贝尔物理学奖!!!!! 刚刚出炉的热乎消息:今年的诺贝尔物理学奖颁发给了约翰霍普菲尔德 (John Joseph Hopfield)与杰弗里辛顿&a…

充电桩用能计量有序充电服务的探索应用

关键词:云平台;自动检测;能源管理;有序充电 今年,电动汽车行业抓住了疫情影响洼地,迅速找到了发展突破口,从电动汽车发行政策到锂电池开发技术均出台了多层面利好消息,未来一段时间…

【JavaEE初阶】深入理解不同锁的意义,synchronized的加锁过程理解以及CAS的原子性实现(面试经典题);

前言 🌟🌟本期讲解关于锁的相关知识了解,这里涉及到高频面试题哦~~~ 🌈上期博客在这里:【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&am…

SpringBoot日常:redission的接入使用和源码解析

文章目录 一、简介二、集成redissionpom文件redission 配置文件application.yml文件启动类 三、JAVA 操作案例字符串操作哈希操作列表操作集合操作有序集合操作布隆过滤器操作分布式锁操作 四、源码解析 一、简介 Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格…

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024(IntelliJ IDEA、PhpStorm、RubyMine、Rider……)安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…

破解反编译:使用 ClassFinal 保护你的SpringBoot代码

在当今数字化时代,保护源代码的安全性变得愈发重要。无论是企业的核心算法还是独特的业务逻辑,代码一旦暴露,便可能导致竞争优势的丧失和商业机密的泄露。因此,在使用 Java 和 Spring Boot 开发项目时,理解从源代码到可…

websocket连接异常报错1006

目录: 1、问题现象2、问题原因3、解决方案 1、问题现象 WebSocket状态码的作用: 在WebSocket协议中,状态码用于表示连接状态和错误信息。通过状态码,我们可以快速判断连接是否成功,以及出现错误时的原因。常见的WebSo…

教培机构如何向知识付费转型

在数字化时代,知识付费已成为一股不可忽视的潮流。面对这一趋势,教育培训机构必须积极应对,实现向知识付费的转型,以在新的市场环境中立足。 一、教培机构应明确自身的知识定位。 在知识付费领域,专业性和独特性是关键…

VUE前后端分离毕业设计题目项目有哪些,VUE程序开发常见毕业论文设计推荐

目录 0 为什么选择Vue.js 1 Vue.js 的主要特点 2 前后端分离毕业设计项目推荐 3 后端推荐 4 总结 0 为什么选择Vue.js 使用Vue.js开发计算机毕业设计是一个很好的选择,因为它不仅具有现代前端框架的所有优点,还能让你专注于构建高性能、高可用性的W…

Matlab实现白鲸优化算法优化回声状态网络模型 (BWO-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 2部分代码 %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 tic load bwand %%…

CC2530定时器1中断实现定时1-3

源码 #include "iocc2530.h"//引用CC2530头文件int t1_Count0; //定时器1溢出次数计数void Init_Led(void){ /*******************LED1初始化部分******************/P1SEL &~ 0x01; //设置P1_0口为通用I/O口P1DIR | 0x01; //设置P1_0口为输出口P…

软考越来越难了,2024年软考究竟还值不值得考?

最近不少同学沟通,聊到软考现在越来越难了,考了两三次都没过,也有不少新同学咨询软考考试的一些福利政策,投入大量的物力,财力,精力,那么到底软考值不值得考呢? 01 / 关于软考 软考…

Leetcode 10. 正则表达式匹配

1.题目基本信息 1.1.题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分…

k8s的控制节点不能访问node节点容器的ip地址

master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…

python爬虫 - 进阶requests模块

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、SSL证书问题 (一)跳过 SSL 证书验证 &#xff0…

Vue3中提到的Tree-shaking

我们知道,Vue3中提到一个叫Tree-shaking的东西,其实也并不是一个新的东西,有人称之为"摇树优化",什么意思? 按照作者的原话解释,Tree-shaking其实就是:把无用的模块进行“剪枝”&…

【Linux】进程间通信——System V消息队列和信号量

一、消息队列 1.1 概念 进程间通信的原理是让不同进程看到同一份资源,资源种类的不同就决定了通信方式的差异。如果用管道通信,则资源是文件缓冲区;如果用共享内存,则资源是内存块 消息队列是由操作系统提供的资源,…

postman自动化实战总结

Postman实战总结 简介 本次实战内容主要包括如下几点: l 背景介绍 l Postman使用,侧重于自动化实现,基础使用不做介绍 l 可视化Newman介绍 l 框架特色 l 实战中的坑 背景 随着国内软件技术的高速发展,越来越多的手工测试…

解决谷歌浏览器在安卓手机上的常见问题

在使用安卓手机浏览网页时,谷歌浏览器无疑是许多用户的首选。然而,在使用过程中,用户可能会遇到一些常见问题,如搜索图片困难、缓存积累过多导致浏览器卡顿,以及无法下载视频等。本文将针对这些问题,提供详…