首页 > 数据库 >Redis-事务

Redis-事务

时间:2024-05-26 22:00:46浏览次数:24  
标签:事务 127.0 0.1 Redis 6379 MySQL

简介

说到事务,一般都会第一时间的想到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指令、乐观锁。

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

标签:事务,127.0,0.1,Redis,6379,MySQL
From: https://blog.csdn.net/Smarmot/article/details/139217378

相关文章

  • MySQL——2、并发事务所带来的问题是什么?怎样去解决?MySQL的默认隔离级别是什么
    一、并发事务所带来的问题1、脏读:就是一个事务对数据进行查询操作时而另一个事物在修改这条数据但未提交,这时进行查询操作的事务就会读取到未提交的数据也就是脏数据2、不可重复读:事务A查询一次数据接着事务B修改了数据并且已提交事务A继续执行操作查询数据读到了不一样的数......
  • 整理好了!2024年最常见 20 道 Redis面试题(八)
    上一篇地址:整理好了!2024年最常见20道Redis面试题(七)-CSDN博客十五、Redis的性能调优有哪些方法?Redis的性能调优是一个多方面的工作,涉及到硬件、配置、代码层面的优化等多个方面。以下是一些常见的性能调优方法:硬件优化:内存:确保有足够的内存来存储数据集和工作集,因为Red......
  • 赶紧收藏!2024 年最常见 20道 Redis面试题(七)
    上一篇地址:赶紧收藏!2024年最常见20道Redis面试题(六)-CSDN博客十三、Redis如何做内存优化?Redis是一个内存中的数据存储系统,因此内存优化对于提高性能和降低成本至关重要。以下是一些Redis内存优化的方法:选择合适的数据类型:根据实际存储的数据特征选择合适的数据类型,比如......
  • 本地/全局/分布式事务
    根据服务架构,事务可以大致划分为三类本地事务:一个服务使用一个数据源全局事务:一个服务使用多个数据源分布式事务:涉及多个服务,不同服务使用不同数据源本地事务由数据库提供支持,如MySQL中的InnoDB存储引擎,提供了ACID实现。全局事务涉及到多个数据源,需要从外部提供支持。XA(......
  • 记录一次Redisson使用synchronized和分布式锁不生效的原因
    最近在开发的过程中,遇到了一个并发场景,用户进行方案复制的时候,当快速点击两次操作的时候,出现了复制方案重名的情况,实际上是复制方案的方案名称,是由后端根据数据库已有的方案名称和当前要复制的方案名称进行逻辑处理,保证方案名称不能重复,比如:要复制的方案名称为“我的方案”,......
  • 服务器部署Redis
    前言:reids历史版本网址:https://download.redis.io/releases/远程服务器:CentOS7.6(本地VM也一样)连接:XShell7与Xftp7图形化桌面:RDM1.安装Redis1)解压并安装Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖。查看是否安装成功:rpm-qa|......
  • 自定义RedisTemplate,解决Redis乱码问题
    问题:使用默认的RedisTemplate来操作Redis,在其底层使用的是JDK序列化器,会导致数据乱码问题,可读性差,其优点是兼容性高。解决:自定义RedisTemplate,使用Jackson序列化器替代JDK序列化器。@ConfigurationpublicclassRedisConfig{@BeanpublicRedisTemplate<String,......
  • Redis 配置
    Redis的配置文件位于Redis安装目录下,文件名为 redis.conf(Windows名为redis.windows.conf)。 查看配置你可以通过 CONFIG 命令查看配置项。 语法CONFIGGET命令格式如下:CONFIGGETCONFIG_SETTING_NAME 实例-获取指定配置项redis127.0.0.1:6379>CON......
  • Netty_Redis_Zookeeper高并发实战-读书笔记
    转载自:https://www.cnblogs.com/leihongzhi/p/17381156.html 第1章    高并发时代的必备技能1.nettyNetty是JBOSS提供的一个Java开源框架,基于NIO的客户端/服务器编程框架,能够快速开发高并发、高可用、高可靠的网络服务器程序,也能开发高可用、高可靠的客户端程序。NIO是......
  • 4.Redis之Redis的通用命令
    0.Redis实战操作通过redis-cli客户端和redis服务器交互涉及到很多的redis的命令【redis的命令非常非常多!!!1.掌握常用命令(多操作多练习)2.学会使用redis的文档->阅读文档,是程序猿的基操!!redis的命令非常非常多!!!1.掌握常用命令(多操作多练习)2.学会......