Redis-事务

简介

说到事务,一般都会第一时间的想到MySQL的事务。

MySQL中事务的提出是为了解决解决原子性操作的,一组执行命令要么全部执行成功,要么执行失败进行回滚,一条也不执行

在Redis中也有事务这个概念,但与MySQL相比,就比较弟弟了~

Redis实现了个类似的效果,但是不能保证实现MySQL的原子性(在新版本中,官方文档Redis把拥有原子性这句话删了)。所实现的效果是:把一组命令打包去执行,中间如果有命令失败了,不回滚,失败了不管(摆烂)~

Redis事务 VS MySQL事务

众所周知,MySQL的事务具有四个特性:原子性、一致性、持久性、隔离性。

原子性

由于MySQL事务的原子性更被广为人知,而Redis并没有回滚机制,因此对于Redis的事务具有原子性这个说法比较有争议。

一种是认为Redis将一组命令看做是一个“原子的”,整个去执行,具有原子性,另一种是认为Redis事务执行过程中失败了不会回滚,不具有原子性~

一致性

在MySQL中存在着很多的约束条件:foreign key、unique、check.......

而在Redis中就没有这些东西,当事务执行出现失败的时候也不会有回滚机制,就可能出现不一致的情况,因此Redis没有一致性

持久性

MySQL是存储在硬盘上的数据库,事务的操作一旦生效之后,就会去修改硬盘。

Redis的数据是存储在内存上的,一般用来做为缓存或者内存数据库,虽然也有Redis具有持久化,但事务提交以后,是先对内存上的数据进行修改,然后根据持久化的相应策略才会进行写硬盘。因此Redis没有持久性(这里说的是事务)。

隔离性

隔离性使用的场景在并发下,但Redis本身是一个单线程模型,所有的指令都是串行去执行的,不需要也不具备隔离性。


Redis的事务既然这么鸡肋,那还为什么要用呢?适用场景是啥?为啥搞的不和MySQL一样?

众所周知,鱼和熊掌不可兼得~Redis的宗旨本来就是简单、高效。

MySQL在事务中搞了这么多特性,是需要付出代价的——空间、时间的开销。

Redis的事务一般适用于需要将一组命令去打包执行,这样就可以避免在执行一个客户端命令的时候,突然跑去执行另一个客户端的命令,用来避免指令“插队”的现象,类似加锁~

事务指令操作

multi - 开启事务

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k3 3
QUEUED

exec - 执行事务

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> set k2 2
QUEUED
127.0.0.1:6379> set k3 3
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK

Redis服务器会对每个客户端引入一个队列,用来存放客户端开启事务后执行的指令,即这些指令是不会马上去执行的,当调用exec的时候,才会去执行。

如果在调用exec之前,服务器重启了或者调用了discard,这些指令就没了~ 

discard - 放弃事务

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k4 4
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"

watch - 监视

用来检查在执行事务期间,监视的key是否修改了,如果修改了不执行,并返回nil.

127.0.0.1:6379> watch k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 111
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get k1
"555"

watch指令的实现方式类似于CAS指令、乐观锁。

先记录当前的值,然后维护一个“版本号”,如果在这期间进行了修改,版本号就回++,然后最后再与版本号进行比对,就能知道期间有没有修改过了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows内核函数 - 添加、修改注册表键值

打开注册表的句柄后,就可以对该项进行设置和修改了。注册表是以二元形式存储的,即“键名”和“键值”。通过键名设置键值,而键值可以划分几个类,如下表所示。 表1 键值的分类 在添加和修改注册表键值的时候,要分类进行…

非线性优化:高斯-牛顿法的原理与实现

非线性优化:高斯-牛顿法的原理与实现 引言 在实际应用中,很多问题都是非线性的。非线性优化问题广泛应用于机器学习、数据拟合、工程设计等领域。高斯-牛顿法是一种常用于解决非线性最小二乘问题的迭代算法。本文将详细介绍高斯-牛顿法的原理、推导过程…

重磅发布,2024精选《制造业商业智能BI最佳实践合集 》

在数字时代,中国制造业正面临着前所未有的深刻变革。 商业环境的复杂性与多变性、全球化竞争的激烈程度、消费需求的快速演变,以及新技术的持续进步等多种因素共同推动着制造企业积极加入数字化转型的潮流。 在这个转型的过程中,转型的速度…

超好用的加密工具

超好用的加密工具 背景 介于行业原因经常要对相关文件进行加密传输,尽可能避免文件的泄漏,保护群众的隐私。于是我就开发了一个非常好用的加密工具。 环境 本工具目前只适用 Windows 操作系统,最好是Windows8以上,否则需要下载额外的依赖…

使用PyAutoGUI识别PNG图像并自动点击按钮

在自动化测试、任务批处理等场景中,我们常常需要控制GUI程序的鼠标键盘操作。PyAutoGUI就是一个非常方便的Python模块,可以帮助我们实现这些操作。今天我们就来看看如何使用PyAutoGUI识别屏幕上的PNG图像,并自动点击图像所在位置。 C:\pythoncode\new\autoguirecongnizepng.py …

AlexNet,LeNet-5,ResNet,VGG-19,VGG-16模型

模型 AlexNet导入必要的库:加载类别名称:创建标签映射字典:加载图像数据和对应的标签:构建AlexNet模型:编译模型:训练模型: LeNet-5导入必要的库:加载类别名称:创建标签映…

程序卡在 B.处什么原因?如何处理?(串口配置无问题,重写putc无问题,但不打印)

文章目录 前提现象:debug:原因总结 前提 为了张流量券多加更一篇,是我2月份遇到的问题的总结,在我的笔记中,一直没发 现象: 已经配置好串口但不打印输出(printf指向串口1 的SR寄存器&#xf…

CentOS下安装SVN客户端及使用方法

一、前言 Subversion(SVN)是一款开源的版本控制系统,它可以帮助开发者追踪和管理代码、文档或其他文件的更改历史。在Linux系统中,特别是在CentOS环境下,安装和使用SVN客户端是日常工作中常见的任务。本文将介绍如何在…

Neovim 配置全面解析(下)

Neovim 配置全面解析(下) 原文:Neovim 配置全面解析(下) - 知乎 (zhihu.com) 环境:Ubuntu 20.04 宿主机:windows (windows terminal)WSL 2 NVIM:v 0.10.0-de…

如何解压忘记了密码的加密zip压缩包?这两个方法收藏好!

加密是一种保护信息不被未经授权访问的重要手段。ZIP压缩包作为一种常见的文件压缩格式,zip文件加密是很多人都回去做的一件事情,那么zip加密文件如何解密?有几种方法可以解密呢?今天介绍几种方法给大家。 一、尝试常用密码 我们…

【Python】解决Python报错:TypeError: ‘xxx‘ object does not support item assignment

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

【busybox记录】【shell指令】unlink

目录 内容来源: 【GUN】【unlink】指令介绍 【busybox】【unlink】指令介绍 【linux】【unlink】指令介绍 使用示例: 删除文件 - 默认 常用组合指令: 指令不常用/组合用法还需继续挖掘: 内容来源: GUN &#x…

xcode依赖包package已经安装,但是提示No such module ‘Alamofire‘解决办法

明明已经通过xcode自带的swift包管理器安装好了依赖包,但是却还是提示:No such module,这个坑爹的xcode,我也只能说服气,但是无奈,没办法攻打苹果总部,只能自己想解决办法了 No such module Ala…

ClickHouse 与其他数仓架构的对比——Clickhouse 架构篇(四)

文章目录 前言ClickHouse与Hive的对比计算引擎的差异ClickHouse比Hive查询速度快的原因 ClickHouse与HBase的对比HBase的存储系统与ClickHouse的异同HBase的适用场景及ClickHouse不适合的原因 ClickHouse与Kylin的对比Kylin的架构Kylin解决性能问题的思路Kylin方案的缺陷ClickH…

图片处理软件有哪些?这三款软件好用

图片处理软件有哪些?在当今这个数字化时代,图片处理软件成为了我们日常生活和工作中不可或缺的工具。无论是为了修饰个人照片,还是为了设计专业海报,这些软件都能帮助我们轻松实现创意和美化。那么,究竟有哪些热门的图…

CEEMDAN +组合预测模型(CNN-Transfromer + XGBoost)

注意:本模型继续加入 组合预测模型全家桶 中,之前购买的同学请及时更新下载! 往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 VMD CEEMDAN 二次分解,Transformer-BiGRU预测模…

read test

功能性语言: 在.sh脚本下,read -p ——答应 read -t 时间 ——时间完成限制 特别注意空格。 test -n测试是内容一定要加双引号。 test 变量1 -ne 变量2 即比较大小。

视频汇聚EasyCVR平台视图库GA/T 1400协议与GB/T 28181协议的区别

在公安和公共安全领域,视频图像信息的应用日益广泛,尤其是在监控、安防和应急指挥等方面。为了实现视频信息的有效传输、接收和处理,GA/T 1400和GB/T 28181这两个协议被广泛应用。虽然两者都服务于视频信息处理的目的,但它们在实际…

22net冒泡排序与插入排序

冒泡排序 观看视频 【python练习题】每日一练_第八天_冒泡排序_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1QT4y197pa/?spm_id_from333.337.search-card.all.click&vd_source498ae9e9c7a8a7d16da872c9d74cdc38PS:视频中用的了numpy库,大…

10W QPS高并发,如何防止重复下单?

小北说在前面 10wqps高并发,如何防止重复提交/支付订单? 10wqps高并发,如何防止重复下单? 10wqps高并发,如何防止重复支付? 10wqps高并发,如何解决重复操作问题? 最近有小伙伴在面试…