Redis(五)-特性-事务

2020-12-01  本文已影响0人  进击的蚂蚁zzzliu

概述

Redis作为数据库使用时自然会想到它对原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)即ACID的支持,本节就来学习下Redis事务

1. 实现

首先,这些命令虽然被客户端发送到了服务器端,但Redis实例只是把这些命令暂存到一个命令队列中,并不会立即执行,当客户端向服务器端发送提交事务的命令,让数据库实际执行第二步中发送的具体操作

1.客户端使用命令MULTI开启事务;
2.客户端发送操作命令,这些命令被发送到了服务器端,但Redis只是做命令正确性校验,然后把这些命令暂存到一个命令队列中,并不会立即执行;
3.当客户端端发送提交事务的命令EXEC,开始实际执行第二步中发送的具体操作

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set key1 888
QUEUED
127.0.0.1:6379> set key2 999
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK

2. 原子性

原子性即一个事务中多个操作同时完成或同时失败;
redis中不同情况下:

总结一下就是Redis对原子性的保证是:要么都运行,要么都不运行, 而不是:要么都正确运行,要么都不运行

3. 一致性

一致性即数据库中数据整体上在执行前后是一致的
redis本身是非关系型数据库,数据库本身对数据没有约束,不存在一致性的概念

4. 隔离性

隔离性即事务执行过程中,事务访问的数据不被其他操作干扰;
redis实现隔离性有两种方式:
1. 使用WATCH来保证,在开启事务之后执行事务之前,监控数据被修改后事务执行失败

事务-隔离性.png
  1. 客户端使用Pipeline API把命令一次性打包发送到服务端,再加上redis本身单线程,因此也可以保证隔离性


    事务-隔离性-pipeline.png
Pipeline p1 = jedis.pipelined();  
//开启事务  
p1.multi();
p1.incr(key1);  
p1.incr(key1);  
//提交事务  
Response txresult= p1.exec();
//关闭pipeline  
p1.sync();
List responses = txresult.get();

5. 持久性

持久性即事务完成后数据被持久化的保存下来不会丢失;
Redis持久性取决于RDB/AOF持久化的配置;但是不管Redis采用什么持久化模式,事务的持久性属性是得不到绝对保证的。

6. 使用建议

1. 在使用事务时,建议配合Pipeline使用

2. 关于 WATCH 命令的使用场景

上一篇 下一篇

猜你喜欢

热点阅读