Redis事务

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 一.使用Redis-Cli执行事务  1.概念和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULIT,EXEC,DISCARD,WATCH这个四个命令是实现事务的基石,Redis中事务的实现特征    1.

一.使用Redis-Cli执行事务

  1.概念

和其它数据库一样,Redis作为NoSQL数据库也同样提供了事务机制。在Redis中,MULIT,EXEC,DISCARD,WATCH这个四个命令是实现事务的基石,Redis中事务的实现特征

    1.在事务中的所有命令都将被串行化的顺序执行,事务执行期间,Redis不会再为其它客户端的请求提供任何服务,从而保证了事务中的所有命令被原子的执行

    2.和关系型数据库中事务相比,在Redis事务中如果由某一条命令执行失败,其后的命令仍然会被继续执行

    3.可以通过MULTI命令开启一个事务,其可以理解为关系性数据库中的“BEGIN TRANSACTION”语句。在该语句之后执行的命令都被视为事务之内的操作,最后我们可以通过执行EXEC或DISCARD命令来提交或回滚事务内的所有操作。这两个语句也可理解为关系型数据库中的COMMIT和ROLLBACK语句

    4.在开启事务之前,如果客户端与服务端之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行,然而如果网络中断时间是发生在客户端执行EXEC命令之后,那么该事务中的所有命令都会被服务器执行

    5.当时用Append-Only模式时,Redis会通过调用系统函数Write将该事务内的所有写操作在本次调用中全部写入磁盘,然而如果在写入的过程中发生系统崩溃,那么此时也许只有部分数据被写入磁盘,而另外一部分数据已经丢失,Redis服务器在重新启动时执行一系列必须的一致性检测,一旦发生类似问题,就会立即退出并给出相应的错误提示。此时只要充分利用Redis工具包中提供的redis-check-aof工具,该工具客户帮助定位到数据不一致的错误,并将已经写入的部分进行回滚。修复后就可以再次重新启动Redis服务器了。

Redis事务是从2.6.5版本开始才有的。2.6.5版本之前是没有事务

2.相关命令列表

命令原型 时间复杂度 命令描述 返回值
MULTI   用于标记事务的开始,其后执行的命令都将被存入命令队列,直到执行EXEC时,这些命令才会被原子的执行。 始终返回OK
EXEC   执行在一个事务内命令队列中的所有命令,同时将当前连接的状态恢复为正常状态,即非事务状态。如果在事务中执行了WATCH命令,那么只有当WATCH所监控的Keys没有被修改的前提下,EXEC命令才能执行事务队列中的所有命令,否则EXEC将放弃当前事务中的所有命令。 原子性的返回事务中各条命令的返回结果。如果在事务中使用了WATCH,一旦事务被放弃,EXEC将返回NULL-multi-bulk回复。
DISCARD   回滚事务队列中的所有命令,同时再将当前连接的状态恢复为正常状态,即非事务状态。如果WATCH命令被使用,该命令将UNWATCH所有的Keys。 始终返回OK。
WATCH key [key ...] O(1) 在MULTI命令执行之前,可以指定待监控的Keys,然而在执行EXEC之前,如果被监控的Keys发生修改,EXEC将放弃执行该事务队列中的所有命令。 始终返回OK。
UNWATCH O(1) 取消当前事务中指定监控的Keys,如果执行了EXEC或DISCARD命令,则无需再手工执行该命令了,因为在此之后,事务中所有被监控的Keys都将自动取消。 始终返回OK。

 3.示例

   1.事务被正确执行

 

     从上面实例中可以看出multi命令是开启了事务,在此命令之后向redis添加数据时都不会直接存储,知道碰到exec命令。

   2.事务中出现失败的命令

从上面代码看出第二条命令失败了,但是它并没有影响其它命令的执行,这一点也是Redis的事务与关系数据库中的事务最为重要的差别

3.回滚事务

  上面代码我们先将键"a"的值设为了“a",然后在事务中将“a”的值改为了,最后回滚事务,我们发现值并没有改变。

 

Watch命令

Watch命令-监听一个(或多个)Key,如果在事务执行之前这个(或这些)被其它命令所改动,那么事务将被打断。

 例:

  从上面我们可以发现一开我们将键“a”的值设为“b”,然后去监听键“a”,然后再将该“a“的值改为“b”,最后执行事务我们发现事务执行失败,

这次代码我们做出了相同的操作,只不过再监听之后到执行事务之前并没有修改键”a“的值,我们发现值在事务中修改成功

 二。使用c#代码处理事务

如果使用C#处理Redis就必须使用”servicestack.redis“得类库包,这个类库包4.0版本以上为收费版本,每天有读取限制,所以在使用时使用4.0版本以下的版本。

下面我们就使用c#来处理Redis事务

首先创建RedisClient对象

RedisClient client = new RedisClient("127.0.0.1", 6379);  //Redis服务端的IP地址与端口号
  using (var tran = client.CreateTransaction())
            {
                try
                {
                    //执行事务命令(切记,每次命令只能执行一条语句)
                    tran.QueueCommand(y =>
                    {
                          y.Set("a", "a");  

                     });
                    tran.QueueCommand(y =>
                    {
                        y.Set("b", "b");

                    });
//提交事务 tran.Commit(); }
catch (Exception ew) { Console.WriteLine(ew.Message);
//回滚事务 tran.Rollback(); } } }

然后使用RedisClient的CreateTransaction方法创建事务,然后使用QueueCommand执行命令,这个命令每次只能执行一条语句,最后执行Commit方法提交,如果出现异常,则使用Rollback方法回滚事务

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
16天前
|
NoSQL Redis 数据库
什么是Redis的事务?
Redis事务提供原子性和顺序性,确保命令按顺序执行且不被打断。核心概念包括原子性、顺序性、隔离性和持久性。关键指令有MULTI、EXEC、DISCARD和WATCH,用于事务的开始、执行、取消和监视。这保障了命令的完整性,防止并发操作导致的数据不一致。
12 2
|
2月前
|
缓存 NoSQL 数据处理
Redis事务悄然而至:命令的背后故事
Redis事务悄然而至:命令的背后故事
26 0
|
3月前
|
缓存 监控 NoSQL
Redis之事务
【1月更文挑战第7天】Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行!一次性、顺序性、排他性!执行一些列的命令。
167 1
|
3月前
|
消息中间件 移动开发 NoSQL
Redis 协议 事务 发布订阅 异步连接
Redis 协议 事务 发布订阅 异步连接
|
3月前
|
缓存 监控 NoSQL
Redis之事务
Redis之事务
|
4月前
|
监控 NoSQL 关系型数据库
|
15天前
|
NoSQL Redis
Redis事务:保证数据操作的一致性和可靠性
Redis事务:保证数据操作的一致性和可靠性
|
5月前
|
监控 NoSQL Redis
【Redis 系列】redis 学习六,redis 事务处理和监控事务
【Redis 系列】redis 学习六,redis 事务处理和监控事务
|
4月前
|
监控 NoSQL Java
Redis数据库 | 事务、持久化
Redis数据库 | 事务、持久化
28 0
|
2月前
|
消息中间件 NoSQL Kafka
Redis事务与异步方式
Redis事务与异步方式
35 0

热门文章

最新文章