Redis事务

一.施用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.事务被科学执行

 图片 1

   
 从下边实例中可以观察multi命令是敞开了作业,在此命令之后向redis添加多少时都不会直接存储,知道碰着exec命令。

   2.事情中出现破产的吩咐

图片 2

从地点代码看出第二条命令失利了,但是它并从未影响此外命令的履行,这或多或少也是Redis的事务与关周详据库中的事务最为根本的区别

3.回滚事务

图片 3

 
上边代码大家先将键”a”的值设为了“a”,然后在事情师长“a”的值改为了,最后回滚事务,大家发现值并从未改动。

 

Watch命令

沃特(Wat)ch命令-监听一个(或两个)Key,假设在作业执行从前这一个(或这一个)被其余命令所改变,那么事务将被打断。

 例:

图片 4

 
从下边大家可以发现一开我们将键“a”的值设为“b”,然后去监听键“a”,然后再将该“a“的值改为“b”,最后执行工作我们发现工作执行破产,

图片 5

这一次代码大家做出了一样的操作,只可是再监听之后到实施工作往日并不曾修改键”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办法回滚事务

网站地图xml地图