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

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

时间:2023-07-31 10:13:19浏览次数:32  
标签:事务 127.0 入门 命令 0.1 Redis 6379

1、事务的定义

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

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

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

2、事务命令

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

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

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

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

示例:

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、事务错误处理

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

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

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

4、事务的冲突问题

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

4.1、悲观锁(Pessimistic Lock)

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

悲观锁的实现:

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

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://www.cnblogs.com/myshare/p/17592689.html

相关文章

  • 手把手带你入门 Spring Security!
    SpringSecurity是Spring家族中的一个安全管理框架,实际上,在SpringBoot出现之前,SpringSecurity就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是Shiro的天下。相对于Shiro,在SSM/SSH中整合SpringSecurity都是比较麻烦的操作,所以,SpringSecurity虽然功能比......
  • redis monitor 监控说明
    1、监视器Redis监视器是用于监控或观察Redis服务器指令执行的一种特殊的客户端。创建Redis监视器的方式也很简单,启动一个客户端后,执行monitor指令,客户端将进入监视器状态。进入监视器状态的客户端将不再接受Redis指令输入,而称为了一个实时接受服务器指令执行信息的消费者。如下图......
  • python操作redis
    redis/relate一、python连接redis1.方式一importredis#创建连接对象r=redis.Redis(host='127.0.0.1',port=6379)r.set('name','zhangsan')print(r.get('name'))2.方式二使用连接池当并发量比较高的时候,频繁的创建连接和释放连接会对性能有影响,使......
  • redis常见的5中数据类型以及相关命令
    redisredis简介redis是采用ASNIC语言编写的采用的是C/S架构是非关系型数据库以键值对的形式存储在内存中redis在windows中的启动命令redis-serverredis.windows.confredis-cli切换到客户端一、redis的数据类型1.String(字符串)最基本的数据结构,可以......
  • redis做消息队列学习
    转自:https://juejin.cn/post/7094272373930590245#heading-9,https://zhuanlan.zhihu.com/p/3442697371、消息队列基本作用:应用解耦(作为中介)、削峰填谷。redis做mq的优点:轻量级,使用和运维成本低。mq的3个基本要求:消息保序sequence:对应消息需要有序消费的场景;处理重复消息dupl......
  • Java面试题 P17:Redis篇:Redis使用场景-缓存-缓存穿透
    什么是缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮。  互斥锁代码:1privatefinalReadWriteLockreadWriteLock=newReentrantReadWriteLock();2privatefinalLock......
  • 1_MyBatis入门
    1_MyBatis入门原生JDBC实现CURD的问题1编码繁琐2需要我们自己将结果集映射成对象3性能不太好 连接池缓存4SQL语句和java代码的耦合度特别高5……MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由ApacheSoftwareFoundation迁移到了GoogleCode,且改名......
  • 08-存储引擎和事务
    08-存储引擎和事务课程目标掌握存储引擎的使用、常用的存储引擎、选择合适的存储引擎、事务概述、事务的提交与回滚演示、自动提交模式、事务的隔离级别。8.1存储引擎的使用数据库中的各表均被(在创建表时)指定的存储引擎来处理。服务器可用的引擎依赖于以下因素:MySQL的版本服务......
  • OpenResty 入门实战(2)--简单使用
    本文主要介绍 OpenResty 结合lua的使用,Nginx功能的一般使用可参考:Nginx入门实战(2)--简单使用;文中所使用到的软件版本:Centos7.9.2009、OpenResty1.21.4.2。1、helloworldserver{listen9096;server_namelocalhost-9096;access_loglogs/access-9096.log;......
  • python数据分析师入门-学习笔记(爬虫-序言)
    爬虫到底是什么概括爬虫是批量化自动获取既有数据批量化自动既有数据通常获取既有数据特殊批量注册一批账号批量去领取优惠券批量自动下单购物自动做任务(签到)实际应用企业中:竞品调研数据采集办公自动化个人:比如看小说有的网站收费有的网站不收费......