`
youyu4
  • 浏览: 442125 次
社区版块
存档分类
最新评论

Redis事务机制

 
阅读更多

Redis事务机制

 

描述

事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。

在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTI、EXEC、DISCARD、WATCH。这四个指令构成了redis事务处理的基础。

 

1. MULTI用来组装一个事务;

2. EXEC用来执行一个事务;

3. DISCARD用来取消一个事务;

4. WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。

 

先看个例子:

redis> MULTI //标记事务开始
OK
redis> INCR user_id //多条命令按顺序入队
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC //执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

 

在上面的例子中,我们看到了QUEUED的字样,这表示我们在用MULTI组装事务时,每一个命令都会进入到内存队列中缓存起来,如果出现QUEUED则表示我们这个命令成功插入了缓存队列,在将来执行EXEC时,这些被QUEUED的命令都会被组装成一个事务来执行。因为,Redis 是单进程单线的工作模式,因此多条命令的执行是不会被中断的。



 

 

对于事务的执行来说,如果redis开启了AOF持久化的话,那么一旦事务被成功执行,事务中的命令就会通过write命令一次性写到磁盘中去,如果在向磁盘中写的过程中恰好出现断电、硬件故障等问题,那么就可能出现只有部分命令进行了AOF持久化,这时AOF文件就会出现不完整的情况,这时,我们可以使用redis-check-aof工具来修复这一问题,这个工具会将AOF文件中不完整的信息移除,确保AOF文件完整可用。

 

 

有关事务,大家经常会遇到的是两类错误:

1. 调用EXEC之前的错误

2. 调用EXEC之后的错误

 

 

“调用EXEC之前的错误”,有可能是由于语法有误导致的,也可能时由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,redis都会进行记录,在客户端调用EXEC时,redis会拒绝执行这一事务。(这时2.6.5版本之后的策略。在2.6.5之前的版本中,redis会忽略那些入队失败的命令,只执行那些入队成功的命令)。我们来看一个这样的例子:

 

127.0.0.1:6379> multi
OK
127.0.0.1:6379> haha //一个明显错误的指令
(error) ERR unknown command 'haha'
127.0.0.1:6379> ping
QUEUED
127.0.0.1:6379> exec
//redis无情的拒绝了事务的执行,原因是“之前出现了错误”
(error) EXECABORT Transaction discarded because of previous errors.

 

 

而对于“调用EXEC之后的错误”,redis则采取了完全不同的策略,即redis不会理睬这些错误,而是继续向下执行事务中的其他命令。这是因为,对于应用层面的错误,并不是redis自身需要考虑和处理的问题,所以一个事务中如果某一条命令执行失败,并不会影响接下来的其他命令的执行。我们也来看一个例子:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 23
QUEUED
//age不是集合,所以如下是一条明显错误的指令
127.0.0.1:6379> sadd age 15 
QUEUED
127.0.0.1:6379> set age 29
QUEUED
127.0.0.1:6379> exec //执行事务时,redis不会理睬第2条指令执行错误
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> get age
"29" //可以看出第3条指令被成功执行了

 

 

WATCH是一个很好用的指令,它可以帮我们实现类似于“乐观锁”的效果,即CAS(check and set)

 



 

 

WATCH本身的作用是“监视key是否被改动过”,而且支持同时监视多个key,只要还没真正触发事务,WATCH都会尽职尽责的监视,一旦发现某个key被修改了,在执行EXEC时就会返回nil,表示事务无法触发。

 

127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> watch age //开始监视age
OK
127.0.0.1:6379> set age 24 //在EXEC之前,age的值被修改了
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec //触发EXEC
(nil) //事务无法被执行

 

 

 

redis 事务的执行与取消

当用户发出 EXEC 的时候,在它 MULTI 命令之后提交的所有命令都会被执行。从代码的实现来看,如果客户端监视的数据被修改,它会被标记 REDIS_DIRTY_CAS,会调用 discardTransaction() 从而取消该事务。特别的,用户开启一个事务后会提交多个命令,如果命令在入队过程中出现错误,譬如提交的命令本身不存在,参数错误和内存超额等,都会导致客户端被标记 REDIS_DIRTY_EXEC,被标记 REDIS_DIRTY_EXEC 会导致事务被取消。

 

因此总结一下:

1. REDIS_DIRTY_CAS 更改的时候会设置此标记

2. REDIS_DIRTY_EXEC 命令入队时出现错误,此标记会导致 EXEC 命令执行失败

 

 

参考:

http://www.jb51.net/article/56448.htm

http://wiki.jikexueyuan.com/project/redis/transaction-mechanism.html

  • 大小: 61.8 KB
  • 大小: 145 KB
分享到:
评论

相关推荐

    redis事务与关系型数据库事务比较

    在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离性和持久性)事务有所不同。以下是对两者事务处理方式的详细对比: 1. **事务开始命令**: - MySQL 使用...

    redis事务回滚工具

    基于SpringBoot的轻量级redis事务回滚机制,使用栈和ThreadLocal记录业务链的redis操作,发生异常进行回滚,参考了阿里巴巴Seata AT模式的db回滚策略:补偿回滚,记录前镜像与当前操作语句,反向解析生成补偿动作。...

    redis事务常用操作详解

    Redis 事务是数据库系统中的一种特性,允许用户一次性提交...例如,Redis事务不支持回滚操作,如果事务中的某条命令失败,后续命令仍会执行。因此,在设计使用Redis的事务时,需要考虑到这些限制并进行适当的错误处理。

    redis事务_动力节点Java学院整理

    Redis 事务(Transactions)是 Redis 数据库提供的一种批量执行命令的功能,尽管它的事务机制相比于传统的关系型数据库事务较为简化,但仍能满足一些基本的事务需求。Redis 事务的主要特点在于其简单、快速和高效,...

    redis6 新功能说明

    Redis 事务机制是一个原子操作机制,允许客户端执行多个命令作为一个原子操作。 八、Redis 持久化机制 Redis 持久化机制有两种:RDB 和 AOF。 1. RDB:RDB 是一种基于快照的持久化机制,能够快速恢复 Redis ...

    redis中事务机制及乐观锁的实现

    本文主要讨论了 Redis 中的事务机制和乐观锁的实现。 **Redis 事务机制** 在传统的数据库系统中,事务具有ACID(原子性、一致性、隔离性和持久性)特性,确保数据操作的一致性。然而,Redis 的事务机制相对较简单...

    cpp-Redis分布式事务

    为了在分布式环境中实现这一点,我们可以利用Redis提供的某些特性,如单个命令的原子执行、发布/订阅机制、分布式锁等。这些工具可以帮助我们在不同节点间协调事务,保证在并发环境下也能正确执行。 在C++中与Redis...

    记录redisson实现redis分布式事务锁

    请注意,虽然这个锁机制可以提高并发控制的可靠性,但它并不能替代数据库的事务管理。如果需要严格的ACID特性,还需要结合数据库事务一起使用。 在Spring Boot项目中,`spring-boot-distributed-redisson-master`这...

    redis源码日志

    - **第16章:redis事务机制** - **简述**: 事务的基本概念及其在Redis中的实现。 - **队列**: 命令队列的管理方式。 - **监视**: 键值监视的功能与实现。 - **执行**: 事务的执行流程及取消机制。 - **第17章:...

    redis事务1

    Redis 事务是 Redis 数据库提供的一种批量执行命令的机制,旨在提高数据操作的效率和原子性。虽然在传统的数据库系统中,事务具有ACID(原子性、一致性、隔离性和持久性)特性,但 Redis 事务并不完全具备这些特性。...

    第7单元 Redis事务与持久化1

    Redis事务是Redis数据库中提供的一种确保数据操作原子性的机制,它允许用户在一个操作序列中执行多条命令,这些命令会被串行化并按顺序执行,以保证在并发环境下的数据一致性。事务的开启是通过`MULTI`命令开始的,...

    redis事务处理:(error) EXECABORT

    然而,事务处理并非总是顺利进行,"redis事务处理:(error) EXECABORT" 是一个常见的错误提示,意味着在执行事务时遇到了问题。本文将深入探讨这个错误的原因以及如何解决。 一、Redis 事务基础 Redis 的事务机制...

    Redis学习笔记—Redis事务

    Redis事务可以一次执行多个命令(按顺序地串行执行,执行中不会被其他命令插入,不许加塞) 1.简介 Redis事务可以一次执行多个命令(允许在一次单独的步骤中执行一组命令)。 特征: [1]批量操作在发送EXEC命令前被放入...

    Redis事务及CAS(Check-And-Set)机制

    Redis事务和CAS(Check-And-Set)机制是Redis中用于处理并发操作的重要特性,确保数据的一致性和完整性。在高并发的网络活动中,如证券交易,这类机制是必不可少的。 Redis事务通过`MULTI`, `EXEC`, `DISCARD`, 和 ...

    redis面试题之事务.zip

    了解并熟练掌握Redis的事务机制对于开发者来说非常必要,特别是在设计高可用和高性能的分布式系统时。通过合理利用事务,可以有效地提高代码的可读性和系统的稳定性。在面试中,对Redis事务的理解和使用经验通常是...

    Redis数据库入门学习教程与面试经验总结(附PDF下载).pdf

    4. Redis 的事务机制:Redis 提供了事务机制,可以实现原子操作。 5. Redis 的 Pub/Sub 机制:Redis 提供了 Pub/Sub 机制,可以实现实时消息推送。 6. Redis 的数据类型:Redis 提供了多种数据类型,如字符串、...

    不支持原子性的 Redis 事务也叫事务吗

    Redis的事务机制不同于传统的关系型数据库,它并不提供ACID(原子性、一致性、隔离性、持久性)中的原子性保证。Redis事务包括三个主要步骤: 1. 开启事务(使用`MULTI`命令) 2. 命令入队(在此阶段,客户端可以...

Global site tag (gtag.js) - Google Analytics