`

Redis事务

 
阅读更多

redis 是单进程单线程的,客户端可以是多线程的,服务端采用队列将并发访问命令排队执行,因此单个命令是原子的。

一 事务

某一个客户端A的一批命令请求,进入服务端队列时中间可能会被穿插进客户端B的命令,因此客户端B的命令与A的命令可能会产生竞态条件。

 

如果希望原子的执行一批命令,可以使用Redis的事务。 

 

localhost:6379[1]> multi //标记以下N个命令(直到exec命令)是一个事务
OK
localhost:6379[1]> incrby count 5 //事务中的命令
QUEUED //添加到队列中,先不执行
localhost:6379[1]> get count//事务中的命令
QUEUED//添加到队列中,先不执行
localhost:6379[1]> exec //执行事务中所有命令,并依次返回每个命令的执行结果
1) (integer) 6
2) "6"

 

 multi命令告诉redis以下所有命令是一个事务,先缓存它们,直到接到exec命令再原子的执行,因此保证了所有命令要么都执行,要么都不执行(断网而后继命令未发给redis)。 

 

 

Redis没有类似于关系数据库的回滚功能,如事务中某有5个命令,其中一个命令出错,其它的也会执行完成。

 

localhost:6379> hmset person:1 name liying sex girl
OK
localhost:6379> multi
OK
localhost:6379> set index 1
QUEUED
localhost:6379> incr person:1 //命令错误
QUEUED
localhost:6379> incr index
QUEUED
localhost:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) (integer) 2
localhost:6379> get index//虽然事务中incr person:1出错了,但index相关的命令还是被执行了。
"2"

 

 

 

二 Watch命令

WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键

值)

 

如在redis中保存一个数值,数值范围 为1-100,当值达到100时再回到1. 

伪代码如下:

1.var val = setnx index 1//index不存在则设值为1
2.if(val ==0){//已经存在index了
3.val = get index //获取index值
4.if(val ==100){//
5.set index 1//值等于100了 -->设置值为1
6.}else{i
7.incr index//值小于100了--》增加1
8.}
9.}

 

 由于第3行到第5行不是原子执行的,所以在取得index值之后,可以index被其它的命令修改了,因此再把index置为1,可能就不正确了。 

为了保证第正确性,考虑使事务,在第3行和第5行加入事件,但事务的中的命令是批量执行,执行完再全部返回结果,中间不能获取index值,就不能判断是如何设置index值了。 

这种情况下使用watch命令

 

1.var val = setnx index 1
2.if(val ==0){//已经存在index了
3.watch index 
4.val = get index //获取index值
5.mutl
6.if(val ==100){//
7.set index 1//值等于100了 -->设置值为1
8.}else{i
9.incr index//值小于100了--》增加1
10.}
11.exec
12.}

 

 watch 会监控index的值,当index 有变化时,后面的事务就不执行了。

 

watch 之后事务不执行的示例:

localhost:6379> set index 1
OK
localhost:6379> watch index
OK
localhost:6379> multi
OK
localhost:6379> incrby index 10
QUEUED
localhost:6379> exec//在exec执行之间,在另一个客户端上修改了index值,使其事务不执行
(nill)
 wath 之后事务执行的示例:
localhost:6379>  set index 1
OK
localhost:6379> watch index
OK
localhost:6379> multi
OK
localhost:6379> incrby index 10
QUEUED
localhost:6379>  exec
1) (integer) 11
 

 

分享到:
评论

相关推荐

    springboot-redis事务

    本文将深入探讨“SpringBoot-Redis事务”这一主题,旨在帮助开发者理解如何在SpringBoot项目中利用Redis进行事务操作。 首先,SpringBoot是Spring框架的一种快速启动方式,它简化了配置,提供了自动配置的功能,...

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

    【Redis 事务与关系型数据库事务的比较】 Redis 和关系型数据库(如 MySQL)在事务处理上有显著的差异。在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离...

    redis事务常用操作详解

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

    redis事务回滚工具

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

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

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

    redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用

    下面是对 Redis 的常用命令、配置文件、持久化、事务、主从复制、Jedis 使用的详细讲解。 Redis 常用命令 Redis 提供了很多有用的命令来管理和操作数据。下面是一些常用的 Redis 命令: * SET key value:设置...

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

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

    redis事务处理:(error) EXECABORT

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

    redis事务1

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

    Redis事务的使用

    一、Redis事务简介 Redis事务可以一次执行多个命令,一个事务的所有命令都会序列化并按顺序地串行化执行,而不会被其他客户端提交的命令请求插入到事务执行命令序列中。 二、Redis事务命令 下面的表格节选自:...

    Redis 事务(上).flv

    Redis 事务(上).flv

    剖析!Redis事务实现原理

    在Redis中实现事务主要依靠以下几个命令来实现:Redis事务从开始到结束通常会通过三个阶段:1.事务开始2.命令入队3.事务执行以下是一个最简单的Redis事务流程:第一步跟其他的关系型数据库类似,也是需要开启一个事务...

    【高频 Redis 面试题】Redis 事务是否具备原子性?

    一、Redis 事务的实现原理 一个事务从开始到结束通常会经历以下三个阶段: 1、事务开始 客户端发送 MULTI 命令,服务器执行 MULTI 命令逻辑。 服务器会在客户端状态(redisClient)的 flags 属性打开 REDIS_MULTI ...

    redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

    redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

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

    本篇文章将详细探讨如何使用Redisson实现Redis分布式事务锁,以及在Spring Boot环境中如何进行集成。 首先,Redis作为一个内存数据库,其高速读写性能使其成为实现分布式锁的理想选择。分布式锁的主要作用是在多...

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

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

    Redis之Redis事务

    本文主要介绍了Redis事务的概念、Redis不保证原子性、Redis事务的三个阶段、Redis事务相关命令以及Redis事务使用案例。 本文来自于博客园,由火龙果软件Anna编辑、推荐。Redis事务的本质是一组命令的集合。事务支持...

Global site tag (gtag.js) - Google Analytics