首页 > 数据库 >Redis 事务

Redis 事务

时间:2023-09-29 18:34:08浏览次数:36  
标签:aa 事务 set aaa 0.1 Redis 6379 127.0

Redis 事务

Redis 中的事务是通过使用 MULTI、EXEC、DISCARD 和 WATCH 命令实现的。以下是这些命令的说明:

  1. MULTI:用于标记事务的开始。在执行 MULTI 后,所有后续的命令都将被认为是事务的一部分。

  2. EXEC:用于执行之前标记的事务。Redis 将按顺序执行事务中的所有命令。

  3. DISCARD:用于取消事务,清空事务队列,并释放与事务关联的任何资源。

  4. WATCH:用于监视一个或多个键,以便在事务执行期间检测到键的变化。如果在 EXEC 执行之前被监视的键发生了变化,事务将被取消。

在 Redis 中,事务是一组命令的集合,这些命令将按顺序执行并原子地提交或回滚。Redis 事务使用 MULTI、EXEC、WATCH、DISCARD 等命令实现。

当客户端发送 MULTI 命令时,Redis 将进入事务模式,并将所有后续命令放入一个队列中,直到客户端发送 EXEC 命令。在 MULTI 和 EXEC 之间执行的所有命令都不会立即执行,而仅会进入事务队列中等待执行。只有在执行 EXEC 命令时,Redis 才会遍历事务队列并以原子方式执行其中的所有命令。

因此,在事务的队列期间,Redis 不会阻塞其他客户端请求。但是事务中的命令如果太多的话,那么在执行的时候会因为单线程而让其他的命令处于等待中,造成阻塞。所以事务中的命令尽量少一些。

正常执行

127.0.0.1:6379> multi 
OK
127.0.0.1:6379> set aa aa
QUEUED
127.0.0.1:6379> set aaa aaa
QUEUED
127.0.0.1:6379> exec

1) OK
2) OK
  127.0.0.1:6379> get aa
  "aa"
  127.0.0.1:6379> get aaa
  "aaa"

 

 

语法出错

语法出错能回滚

127.0.0.1:6379> set aa aa
OK
127.0.0.1:6379> set aaa aaa
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set aa
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> set aaa bbb
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get aaa
"aaa"

 

 

命令出错

aa的值是字符串,不能INCR ,但是能继续执行后续的命令

127.0.0.1:6379> set aa aa
OK
127.0.0.1:6379> set aaa aaa
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> INCR aa
QUEUED
127.0.0.1:6379> set aaa bbb
QUEUED
127.0.0.1:6379> exec

1) (error) ERR value is not an integer or out of range
2) OK
  127.0.0.1:6379> get aa
  "aa"
  127.0.0.1:6379> get aaa
  "bbb"
 

 

 

DISCARD命令

127.0.0.1:6379> set aa aa
OK
127.0.0.1:6379> set aaa aaa
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set aa 11
QUEUED
127.0.0.1:6379> set aaa 111
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get aaa
"aaa"

 

 

多事务

客户端1:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set aa 11
QUEUED
127.0.0.1:6379> set aaa 111
QUEUED
127.0.0.1:6379> exec     步骤1

1) OK
2) OK
  127.0.0.1:6379> get aa
  "11"
  127.0.0.1:6379> get aaa
  "111"
  127.0.0.1:6379>

 

客户端2

127.0.0.1:6379> multi 
OK
127.0.0.1:6379> set aa 22
QUEUED
127.0.0.1:6379> set aaa 222
QUEUED
127.0.0.1:6379> exec       步骤2

1) OK
2) OK
  127.0.0.1:6379> get aa
  "22"
  127.0.0.1:6379> get aaa
  "222"

 

这里的步骤1先于步骤2执行

 

watch命令

客户端1

127.0.0.1:6379> get aa
"aa"
127.0.0.1:6379> get aaa
"aaa"
127.0.0.1:6379> watch aa   步骤1
OK
127.0.0.1:6379> MULTI   步骤2
OK
127.0.0.1:6379> set aa 11   步骤3
QUEUED
127.0.0.1:6379> set aaa 111 步骤4
QUEUED
127.0.0.1:6379> exec   步骤6
(nil)
127.0.0.1:6379> get aa
"99"
127.0.0.1:6379> get aaa
"aaa"

客户端2

127.0.0.1:6379> set aa 99   步骤5
OK
127.0.0.1:6379> get aa
"99"

这里的步骤345的顺序可以调换不影响结果,客户端1的执行要回滚

 

 

多客户端watch

客户端1

127.0.0.1:6379> WATCH aa
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set aa 11
QUEUED
127.0.0.1:6379> set aaa 111   步骤1
QUEUED
127.0.0.1:6379> exec

1) OK
2) OK

 

客户端2

127.0.0.1:6379> WATCH aa
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set aa 22
QUEUED
127.0.0.1:6379> set aaa 222     步骤2
QUEUED
127.0.0.1:6379> exec
(nil)

客户端3

127.0.0.1:6379> get aa
"11"
127.0.0.1:6379> get aaa
"111"

 

客户端1先执行到步骤1,然后客户端2执行到步骤2,

再执行客户端1exec,返回结果ok

客户端2exec,返回结果nil

说明客户端2回滚了。

 

阻塞

在Redis中,DEBUG SLEEP命令可以用于模拟阻塞的效果。该命令会使当前客户端线程休眠指定的时间。

下面是一个示例,演示如何使用DEBUG SLEEP命令创建一个阻塞时间较长的事务:

客户端1

MULTI
SET key1 value1
DEBUG SLEEP 10
SET key2 value2
EXEC

这时如果有客户端2查询的话,会阻塞等待客户端1的命令执行结束。

 

 

关于回滚

redis的回滚可以理解为取消exec。

在事务中,语法出错导致整个事务无法exec。

但是语法没有问题,命令错误的话是可以 继续执行完整个事务的。

标签:aa,事务,set,aaa,0.1,Redis,6379,127.0
From: https://www.cnblogs.com/fanxingrushui/p/17737155.html

相关文章

  • Linux Centos7 虚拟环境安装Redis教程(超详细)
    一、Redis的介绍1、基于内存或持久化的日志型、key-value型的Nosql数据库2、Redis六大特性:速度快、广泛的语言支持、持久化、多种数据结构、主从复制、高可用与分布式。二、Redis安装下载1、官网下载官网:https://redis.io/download/选择Redhat/Centos7下载tar.gz压缩包......
  • C# 事务实现代码
     //简单事务实现代码staticvoidTest(){DataTabledt=newDataTable();SqlConnectioncnn=newSqlConnection("连接字符串");SqlCommandcmd=newSqlCommand();cmd.Connection=cnn;cnn.Open();SqlTransactiontrans=cnn.BeginTransaction()......
  • Redis持久化相关
    关于Redis持久化RDB(redisdatabase):在指定的时间间隔对数据进行快照存储,全量存储。它以紧缩的二进制文件保存Redis数据库某一时刻所有数据对象的内存快照,可用于Redis的数据备份、转移与恢复。AOF(appendonlyfile):记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令......
  • Logstash 获取通道类型 Redis 数据
    Redis服务器是logstash官方推荐的broker选择。Broker角色也就意味着会同时存在输入和输出俩个插件。这里我们先学习输入插件。LogStash::Inputs::Redis 支持三种 data_type(实际上是redis_type),不同的数据类型会导致实际采用不同的Redis命令操作:list=>BLPOPchannel......
  • Redis加载其他模块
    加载第三方模块gitclonehttps://github.com/wujunze/redis-module-panda.gitmakedockercppanda.soredis:/如果网络不好,下载不下来,可以下载到windows下,通过scp工具上传到服务器。make之后生成panda.so文件,拷贝到容器内部。两种加载方式启动时加载redis.conf添......
  • PostgreSQL数据库事务系统——获取virtual transaction id
    如果一个事务没有进行INSERT、UPDATE、DELETE操作,那么就步会分配事务ID,但事务仍然用一个虚拟事务ID代表自己。虚拟事务ID由两部分组成,第一部分是BackendID,另一个是每个会话自己维护的本地事务ID计数器。通过两部分组合,能保证这个虚拟事务ID的唯一性。在PostgreSQL数据库IPC——SI......
  • redis锁简单实现
    不要用get,get的话有可能并发使用setnxex NX :只在键不存在时,才对键进行设置操作。SETkeyvalueNX效果等同于SETNXkeyvalue。EX second:设置键的过期时间为second秒。SETkeyvalueEXsecond效果等同于SETEXkeysecondvalue。Booleanflag=jedisTemplat......
  • linux安装redis
    一、下载redissudoaptinstallredis-server 二、修改配置文件sudovim/etc/redis/redis.conf daemonizeyes    后端模式启动bind0.0.0.0     外网可访问,且去除ipv6限制requirepass     修改密码 三、服务管理1、重启服务sudoserviceredis-se......
  • redis为什么这么快、底层磁盘以及IO模型
    一、底层磁盘IO机制Redis是单进程单线程?为什么这么快:进入redis安装目录下执行以下命令,查看setlpush命令的处理效率:./redis-benchmark-tset,lpush-n100000-q根据官方的数据,Redis的QPS可以达到10万左右(每秒请求数)。就我这个虚拟机的性能,可以看到每秒......
  • 安装解压版Redis数据库
    1、上传redis-7.0.9.tar.gz压缩包到/usr/local目录2、解压tar-xzvfredis-7.0.9.tar.gz3、进入目录cdredis-7.0.94、编译redis:make5、安装makeinstallPREFIX=/usr/local/redis将安装路径设为/usr/local/redis6、make报错pkg-config:notfound,即 yuminstallpkg-con......