首页 > 数据库 >Redis从入门到放弃(5):事务

Redis从入门到放弃(5):事务

时间:2023-08-03 19:38:44浏览次数:40  
标签:事务 127.0 入门 命令 0.1 Redis 6379



文章目录

  • 1、事务的定义
  • 2、事务命令
  • 3、事务错误处理
  • 4、事务的冲突问题
  • 4.1、悲观锁(Pessimistic Lock)
  • 4.2、乐观锁(Optimistic Locking)
  • 5、总结:事务三特性


1、事务的定义

Redis的事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制。

redis事务的主要作用就是串联多个命令防止别的命令插队。

但是,事务并不具有传统数据库事务的特性,如回滚。

2、事务命令

Redis中的事务可以通过以下命令来执行:

  • MULTI:用于开启一个事务块,表示之后的命令将被放入事务队列中,但并不会立即执行。
  • 事务命令:在MULTIEXEC之间的所有命令都将被添加到事务队列中。
  • EXEC:用于执行事务队列中的所有命令。执行事务后,事务队列会被清空。
  • DISCARD:用于取消事务,清空事务队列中的命令。
  • WATCH:监视一个或多个键,当被监视的键被修改时,事务将被打断。

Redis事务分2个阶段:组队/打包阶段、执行阶段

  • 组队/打包阶段:将所有命令加入命令队列
  • 执行阶段:依次执行队列中的命令,期间不会被其他客户端发送的请求命令插队或打断。

Redis从入门到放弃(5):事务_redis

示例:

redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Redis从入门到放弃"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "Redis" "入门" "放弃"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Redis从入门到放弃"
3) (integer) 3
4) 1) "Redis"
   2) "入门"
   3) "放弃"

3、事务错误处理

事务错误处理方式分为两个阶段:组队时错误执行时错误

  • 组队时错误:如果在组队过程中出现错误,整个队列中的所有命令都将被取消。

Redis从入门到放弃(5):事务_redis_02

  • 执行时错误:如果在执行阶段出现错误,会导致部分命令执行成功,部分命令执行失败。

Redis从入门到放弃(5):事务_客户端_03

4、事务的冲突问题

为了解决事务的冲突问题,可以使用锁,包括悲观锁和乐观锁。

4.1、悲观锁(Pessimistic Lock)

悲观锁是一种对数据修改持有悲观态度的并发控制方式。它总是假设最坏的情况,每次读取数据时都默认其他线程会更改数据,因此需要加锁操作。

悲观锁的实现:

  • 传统的关系型数据库使用这种锁机制,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁。
  • Java 里面的同步 synchronized 关键字的实现。

Redis从入门到放弃(5):事务_Redis_04

4.2、乐观锁(Optimistic Locking)

乐观锁相对于悲观锁而言,它假设数据一般情况下不会造成冲突,只在数据提交更新时才检测是否冲突。如果冲突,则返回异常信息,让用户决定如何处理。乐观锁适用于读多写少的场景,可以提高程序吞吐量。

乐观锁的实现:

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

Redis通过CAS (Check and Set) 实现乐观锁,使用WATCH指令监听一个或多个键,当用户提交修改事务时,会检查监听的键是否发生变化。若没有发生变化,则提交成功;否则,事务失败。

例如,两个客户端在同一时间开始一个事务,他们都对同一个键的值进行了修改,但在执行事务的EXEC命令时,只能有一个客户端的事务能够成功,另一个客户端的事务会因为键的值发生了改变而执行失败。

客户端1:

# 刷新数据库
127.0.0.1:6379> FLUSHDB
OK
# 设置key值
127.0.0.1:6379> set key 10
OK
# 监听key
127.0.0.1:6379> WATCH key
OK
# 开启事务
127.0.0.1:6379> MULTI
OK

客户端2:

# 监听key
127.0.0.1:6379> WATCH key
OK
# 开启事务
127.0.0.1:6379> MULTI
OK

客户端1:

# 指令加入队列
127.0.0.1:6379(TX)> INCR key
QUEUED
# 执行指令,可以看到执行成功,修改了一条数据,值被更新为11
127.0.0.1:6379(TX)> EXEC
1) (integer) 11

客户端2:

127.0.0.1:6379(TX)> INCR key
QUEUED
127.0.0.1:6379(TX)> exec
(nil)

5、总结:事务三特性

Redis事务具有以下三个特性:

  1. 单独的隔离操作:事务中的命令会被序列化并按顺序执行,不会被其他客户端的指令打断。
  2. 没有隔离级别的概念:事务提交前所有指令都不会被执行。
  3. 无原子性:事务组队时具有原子性,但在执行阶段出错某段指令,事务过程中的指令仍然会生效。


标签:事务,127.0,入门,命令,0.1,Redis,6379
From: https://blog.51cto.com/u_13693015/6952269

相关文章

  • Redis从入门到放弃(4):3种新数据类型
    文章目录1、介绍2、Bitmaps(位图)2.1、特性2.2、原理2.3、应用场景2.4、代码3、HyperLogLog(基数统计)3.1、特性3.2、原理3.3、应用场景3.4、代码4、Geospatial(地理位置)4.1、特性4.2、原理4.3、应用场景4.4、代码5、总结1、介绍前面的文章已经介绍了redis的5种基本数据类型,redis6中......
  • Redis从入门到放弃(3):发布与订阅
    文章目录1、介绍2、如何使用发布订阅2.1、订阅频道2.2、发布消息2.3、取消订阅2.4、模式订阅2.5、取消模式订阅3、使用案例(伪代码)4、Redis的发布订阅与ActiveMQ、RocketMQ区别1、介绍Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。......
  • Redis从入门到放弃(1):安装配置
    文章目录1.介绍2.优势3.安装Redis4.后台运行5.配置Redis5.1查看配置项5.2修改配置项5.3参数说明6.错误解决1.介绍Redis是一个高性能的开源key-value数据库。它被广泛应用于缓存、会话存储、实时分析、消息队列等场景。Redis具有以下三个主要特点:数据持久化:Redis支持......
  • Redis从入门到放弃(2):数据类型
    文章目录1.字符串(String)1.1、介绍1.2、命令示例1.3、注意事项2.哈希(Hash)2.1、介绍2.2、命令示例2.3、注意事项3.列表(List)3.1、介绍3.2、命令示例3.3、注意事项4.集合(Set)4.1、介绍4.2、命令示例5.有序集合(SortedSet)5.1、介绍5.2、命令示例6、总结在Redis中,数据以键值对的形......
  • 怎么设置centos限定redis使用的内存
    1、Redis-Cluster集群2、怎么设置centos限定redis使用的内存3、高性能高并发网站架构,教你搭建Redis5缓存集群4、Redis-Cluster5、「实用教程」在配备持久内存的实例上部署Redis应用Redis-Cluster集群1、连接如下https://redis.io/topics/cluster-tutorial以下步骤是在一......
  • 新一代开源流数据湖平台Apache Paimon入门实操-上
    @目录概述定义核心功能适用场景架构原理总体架构统一存储基本概念文件布局部署环境准备环境部署实战Catalog文件系统HiveCatalog创建表创建Catalog管理表查询创建表(CTAS)创建外部表创建临时表修改表修改表修改列修改水印概述定义ApachePaimon官网https://paimon.apache.org......
  • T4 模板: 为 ASP.NET MVC 开发人员快速入门指南
    http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx 在中提到我们的最近博客文章,ASP.NETMVC发布候选版,我们的代码生成功能(即,添加控制器和添加视图)现在使用T4(文本模板转换工具包)模板化技术在幕后。因为......
  • elasticsearch集群等概念入门
    欢迎来到Elasticsearch的奇妙世界,它是优秀的全文检索和分析引擎。不管你对Elasticsearch和全文检索有没有经验,都不要紧。我们希望你可以通过这本书,学习并扩展Elasticsearch的知识。由于这本书也是为初学者准备的,我们决定先简单介绍一般性的全文检索概念,接着再简要概述Elasticsearch......
  • mysql事务和索引详解
    mysql事务和索引详解1.事务注:事务就是一组操作的集合,成功一起成功,失败一起失败事务控制:开启事务:starttransaction;/begin;提交事务:commit;回滚事务:rollback;使用方法:首先graphTBid1[开启事务]-->id2{执行mysql}id2-->|语句全部执行成功|id3>提交事务]id2-->|语......
  • Java入门题-百钱买百鸡
    题:100钱买100只鸡,必须满足,钱花完,鸡百只 重点:循环语句来枚举所有可能性 代码:byteplan=1;for(inti=0;i<20;i++){for(inti1=0;i1<34;i1++){for(inti2=0;i2<101;i2++){if(((i*5+i1*3+i2)==100)&&((i+i1......