1.Redis事务

  • Redis的事务是通过multi、exec、discard和watch这四个命令来完成的。
  • Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。
  • Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行 Redis不支持回滚操作
    注意:
    1.Redis: 命令是顺序执行的,在一个事务中,有可能被执行其他客户端的命令的
    2.Redis有持久化但不保证 数据的完整性

2.事务命令

  • multi:用于标记事务块的开始,Redis会将后续的命令逐个放入队列中,然后使用exec原子化地执行这个
    命令队列
  • exec:执行命令队列
  • discard:清除命令队列
  • watch:监视key
  • unwatch:清除监视key
    以下截图展示当redis开启事务时,执行set命令时,执行结果不会立即返回,而是放到一个请求队列中:
    redis客户端1

    redis客户端2
    可以看出客户端1set过的name:2 在客户端2中通过get key命令获取时是空的

    以下展示在事务中如果执行了(discard:清除命令队列)那么再提交事务时会报以下错误

    以下截图展示如果先在客户端1 watch 一个key,开启事务,接着set一个key:value后 ,再从客户端2从新修改了这个客户端1watch的这个key值,那么客户端1在提交事务的时候会清空队列。
    客户端1

    客户端2

3.事务的执行过程

事务的执行

  1. 事务开始
    在RedisClient中,有属性flags,用来表示是否在事务中
    flags=REDIS_MULTI
  2. 命令入队
    RedisClient将命令存放在事务队列中
    (EXEC,DISCARD,WATCH,MULTI除外)
  3. 事务队列
    multiCmd *commands 用于存放命令
  4. 执行事务
    RedisClient向服务器端发送exec命令,RedisServer会遍历事务队列,执行队列中的命令,最后将执
    行的结果一次性返回给客户端。
    如果某条命令在入队过程中发生错误,redisClient将flags置为REDIS_DIRTY_EXEC,EXEC命令将会失败
    返回。
    流程图:

    部分源码
typedef struct redisClient{
// flags int flags //状态
// 事务状态
multiState mstate; // .....
}redisClient;// 事务状态
typedef struct multiState{ // 事务队列,FIFO顺序 // 是一个数组,先入队的命令在前,后入队在后 multiCmd *commands;// 已入队命令数 int count;
}multiState; // 事务队列
typedef struct multiCmd{// 参数robj **argv; // 参数数量 int argc; // 命令指针 struct redisCommand *cmd;
}multiCmd;

4.Watch的执行

使用WATCH命令监视数据库键redisDb有一个watched_keys字典,key是某个被监视的数据的key,值是一个链表.记录了所有监视这个数据的客户端。监视机制的触发当修改数据后,监视这个数据的客户端的flags置为REDIS_DIRTY_CAS
事务执行
RedisClient向服务器端发送exec命令,服务器判断RedisClient的flags,如果为REDIS_DIRTY_CAS,则清空事务队列。

typedef struct redisDb{
// .....
// 正在被WATCH命令监视的键
dict *watched_keys;
// .....
}redisDb;

5.Redis的弱事务性

  • Redis语法错误
    整个事务的命令在队列里都清除
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sets m1 44
(error) ERR unknown command `sets`, with args beginning with: `m1`, `44`,
127.0.0.1:6379> set m2 55
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get m1 "22"

flags=REDIS_DIRTY_EXEC

  • Redis运行错误
    在队列里正确的命令可以执行 (弱事务性)
    弱事务性 :
    1、在队列里正确的命令可以执行 (非原子操作)
    2、不支持回滚
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set m1 55
QUEUED
127.0.0.1:6379> lpush m1 1 2 3 #不能是语法错误
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get m1
"55"

总结

Redis不支持事务回滚(为什么呢)
1、大多数事务失败是因为语法错误或者类型错误,这两种错误,在开发阶段都是可以预见的
2、Redis为了性能方面就忽略了事务回滚。 (回滚记录历史版本)

如何理解Redis中的事务相关推荐

  1. Redis系列之key操作命令与Redis中的事务详解(六)

    From: http://www.cnblogs.com/knowledgesea/p/5008594.html 序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查 ...

  2. Redis初学:14(Redis中的事务)

    Redis中的事务 Redis的事务定义 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. Redis事务的主 ...

  3. redis中的事务、lua脚本和管道的使用场景

    https://blog.csdn.net/fangjian1204/article/details/50585080 事务 redis中的事务并不像mysql中那么完美,只是简单的保证了原子性.re ...

  4. 深入理解redis中的lua脚本

    本文来说下redis中的lua脚本 文章目录 概述 Lua简介 使用Lua脚本的好处 Redis+Lua实现限流 本文小结 概述 今天讲一些redis和lua脚本的相关的东西,lua这个脚本是一个好东 ...

  5. 理解 redis 中的 哈希对象类型

    redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用Dictionary存放的话,可以根据场景 ...

  6. 第一百三十七期:一个简单的小案例带你理解MySQL中的事务

    事务又叫做TCL,全称是transaction control language,意思是事务控制语言. 作者:Java的架构师技术栈 事务又叫做TCL,全称是transaction control l ...

  7. 一文带你深入理解Redis中的底层数据结构,再也不怕不懂数据类型的底层了

    数据结构前言 都说Redis快,因为什么呢?只是因为它是内存数据库,所有操作都是基于内存进行的吗?其实不然,这与它的数据结构也是密不可分的.下面我们就来了解一下Redis的数据结构. Redis 数据 ...

  8. 【承】Redis 原理篇——关于 Redis 中的事务

    前言 关于 Redis 的"起承转合",我前面已经用五个篇章的长度作了一个 Redis 基础篇--"起"篇的详细阐述,相信大家无论之前有没有接触过 Redis, ...

  9. 理解 redis 中的 集合对象类型

    这篇我们来看看Redis五大类型中的第四大类型:集合类型,集合类型还是蛮有意思的,第一个是因为它算是只使用key的Dictionary简易版,这样说来的话,它就比Dictionary节省很多内存消耗, ...

最新文章

  1. opencv学习(十六)之颜色空间转换cvtColor()
  2. vb asp.net的一些属性值
  3. Java程序员必须掌握的常用Linux命令
  4. c语言课程思政教案设计,设计类专业课程思政教学案例及教学设计
  5. leetcode367. 有效的完全平方数
  6. 原理 rpm_图文详解,微型直流电机的工作原理
  7. CSS Lint-线上CSS检测工具 让你的样式表更正确精简
  8. 最新!2020录取分数百强大学榜发布:清华文科第一,北大理科第一!
  9. java 代码走查_代码走查如何保证软件质量
  10. buuctf————[NPUCTF2020]你好sao啊
  11. html5gps定位经纬度,html5 定位 获得当前位置的经纬度
  12. 《the TRUMAN show》 观后感:不寒而栗
  13. Alpha版本冲刺(三)
  14. 分枝PEI修饰的PLGA纳米粒/载柚皮素的牛血清白蛋白修饰PLGA纳米粒/包封香豆素-6的PLGA纳米粒
  15. [Git] 配置Github Gitee reference加速
  16. 财务自由之好认知好价格
  17. 微信小程序在使用权限时,不弹弹框
  18. 分布式计算、云计算与大数据第四章
  19. 2021年煤矿采煤机(掘进机)操作模拟试题及煤矿采煤机(掘进机)操作证考试
  20. NVIDIA APX 能直接运行QUAKE 3,真正的手机3D游戏时代不远了!

热门文章

  1. 常见WebShell客户端的流量特征及检测思路
  2. #《算法竞赛入门经典》勘误
  3. zcmu-1957: 乌鸦坐飞机
  4. ubuntu安装pandas
  5. 第2章 Python 数字图像处理(DIP) --数字图像基础2 - 图像感知要素 - 图像取样和量化 - 空间分辨率和灰度分辨率
  6. 无线网主域名服务器,主域名服务器和网关的关系
  7. 算法——动态规划(DP)
  8. AdaBoost算法讲解、举例
  9. 正向代理与反向代理是什么,有什么区别?
  10. adb 卸载android系统程序