Redis学习笔记(二十一) 事务

Redis学习笔记(二十一) 事务文章开始啰嗦两句,写到这里共21篇关于redis的琐碎知识,没有过多的写编程过程中redis的应用,着重写的是redis命令、客户端、服务器以及生产环境搭建用到的主从、哨兵、集群实现原理,如果你真的能

Redis学习笔记(二十一) 事务

文章开始啰嗦两句,写到这里共21篇关于redis的琐碎知识,没有过多的写编程过程中redis的应用,着重写的是redis命令、客户端、服务器以及生产环境搭建用到的主从、哨兵、集群实现原理,如果你真的能看的进去,相信对你在以后用到redis时会有一定的帮助。

写到现在,redis相关的内容暂时告一段落了,以后可能更着重的去介绍c#相关的知识,包括用到IL、.net core底层、微服务等知识。

哎呀,写着写着突然又想啰嗦几句,最近几年c#在国内式微java如日中天,好多微软系的小伙伴或者各路大神都不看好c#,网上相关的帖子更是多如牛毛,另外一个现象就是从职位到薪资被java、go等语言甩了n条街。

但我觉得抛开这些外界因素,单从技术或者说是语言上讲c#其实非常优秀,虽然近几年.net  core 有些不伦不类、各种借鉴(抄袭)其他语言的语法糖、各个大版本之间不兼容等问题一堆,但是这并不影响他的优秀,毕竟成长确实要走很多弯路,所以希望有兴趣继续搞搞.net 的童鞋可以持续关注c#。


 

Redis通过MULTI、EXEC、WATCH等命令来实现事务,事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而改去执行其他客户端命令请求,他会将事务中的所有命令执行完毕,然后采取处理其他客户端的命令请求。

一个事务从开始到结束通常会经历以下三个阶段:事务开始、命令入队、事务执行。

1)事务开始

MULTI命令的执行标志是事务的开始,MULTI命令可以将执行该命令的客户端的从非事务状态切换至事务状态,这一切是通过在客户端状态的flags属性中打开REDIS_MULTI标识来完成的。

2)命令入队

如果客户端发送的命令为EXEC、DISCARD、WATCH、MULTI四个命令的其中一个,那么服务器立即执行这个命令,相反,服务器并不会立即执行这个命令,而是将命令放入到一个事务队列中,而后向客户端返回QUEUED回复。

每个Redis客户端都有自己的事务状态,这个事务状态保存在客户端状态的mstate属性里面:

typedef struct redisClient{
    //事务状态
    multiState mstate;
} redisClient;

代码100分

事务状态包含一个事务队列,以及一个已入队命令的计数器:

代码100分typedef struct multiState{
    //事务队列,FIFO顺序
    multiCmd *commands;
    ///已入队列计数
    int count;
} multiState;

typedef struct multiCmd{
    //参数
    robj **argv;
    //参数数量
    int argc;
    //命令指针
    struct redisCommand *cmd;
} multiCmd;

事务队列以先进先出的方式 保存入队的命令。

3)执行事务

当一个处于事务状态的客户端向服务器发送EXEC命令时,这个EXEC命令将立即被服务器执行。服务器会遍历这个客户端的事务队列,执行队列中保存的所有命令,最后将执行命令所得的结果全部返回给客户端。

WATCH命令

watch命令是一个乐观锁,它可以在exec命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过,如果是的话,服务器将拒绝执行事务,并向客户端返回标识事务执行失败的空回复。

每个Redis数据库都保存着一个watched_keys字典,这个键是某个被watch命令监视的数据数据库键,而字典的值是一个链表,链表中记录了所有被监视相应数据库键的客户端。

代码100分typedef struct redisDb{
    //正在被watch命令监视的键
    dict *watched_keys;
} redisDb;

监视机制的触发:所有对数据库进行修改的命令,在执行之后都会调用touchWatchKey函数对watched_keys字典进行检查,查看是否在客户端正在监视刚刚被命令修改过的数据库键,如果有的话,那么touchWatchKey函数会将监视被修改键的客户端的REDIS_DIRTY_CAS标识打开,标识该客户端的事务安全性已经被破坏。

 

判断事务是否安全

当服务器接收到一个客户端发来的EXEC命令时,服务器会根据客户端是否打开REDIS_DIRTY_CAS标识来决定是否执行事务:如果客户端的REDIS_DIRTY_CAS标识已经被打开,那么说明客户端所监视的键当中,至少有一个键已经被修改过了,在这种情况下,客户端提交的事务已经不再安全,所以服务器会拒绝执行客户端提交的事务;如果客户端REDIS_DIRTY_CAS标识没有被打开,那么说明客户端监视的所有键都没有被修改过,事务仍然是安全的,服务器将执行客户端提交的这个事务。

 

事务的ACID性质

原子性:Redis的事务和传统的关系型数据库事务最大的区别在于,Redis不支持事务回滚机制,事务队列中的某个命令在执行期间出现错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。

一致性:

1、入队错误,如果一个事务在入队命令的过程中,出现了命令不存在,或者命令的格式不正确的情况那么Redis将拒绝执行这个事务

2、执行错误:执行过程中发生的错误都是一些不能再入队时被服务器发现的错误,这些错误只会在命令实际执行时被触发;即使在事务的执行过程中发生了错误,服务器也不会中断事务的执行,他会继续执行事务中余下的其他命令,并且一致性的命令不会被出错的命令影响。

3、服务器停机:如果服务器运行在无持久化的内存模式中,那么重启之后数据库将是一片空白的,因此数据总是一致性的;如果服务器运行了RDB模式下,那么事务中途停机不会导致不一致性,因为服务器可以根据现有的RDB文件来恢复数据,从而将数据库还原到一个一致性的状态。如果服务器运行在APF模式下,那么事务中途停机不会导致不一致性,因为服务器可以根据现有的APF文件来恢复数据,从而将数据库还原至一致的状态。

隔离性:Redis使用单线程的方式执行事务,并且服务器保证,在执行事务期间不会对事务中断,因此,redis的事务总是以串行的方式运行,并且事务也总是具有隔离性的。

耐久性:Redis事务的耐久性由Redis所使用的持久化模式决定的,(不论Redis在什么模式下运行,在一个事务的最后加上SAVE命令总可以保证事务的耐久性。)

 


每天学一点,总会有收获。

 

说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

 


 

Redis学习笔记(二十一) 事务

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7899.html

(0)
上一篇 2023-03-11
下一篇 2023-03-11

相关推荐

  • 数据库死锁排查及处理方法视频_数据库的死锁会一直等待

    数据库死锁排查及处理方法视频_数据库的死锁会一直等待MySQL查看死锁和解除锁 的两种方法 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程。否…

    2023-02-25
    148
  • Python Extend()方法:扩展列表的元素

    Python Extend()方法:扩展列表的元素在Python中,列表是一种很常见的数据类型。列表是可变的,这就意味着可以对列表进行添加、删除和修改操作。Extend()方法是Python列表中的一个非常重要的方法。这个方法用于向列表中添加一些新的元素,扩展列表的长度。

    2023-12-19
    103
  • 用Python生成随机数

    用Python生成随机数a href=”https://beian.miit.gov.cn/”苏ICP备号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-07-31
    32
  • 阿里云分析型数据库MySQL版(AnalyticDB)测试初体验[通俗易懂]

    阿里云分析型数据库MySQL版(AnalyticDB)测试初体验[通俗易懂]其实是测试半遂体验。 这阵子对OLAP数据库产生了兴趣,先是简单测试了ClickHouse,性能的确不错,不过它在稳定&可靠性,整体生态&周边配套方面还有待加强,我会持续保持关注。 3月27日,腾讯…

    2023-02-23
    149
  • 如何从文本文件读入 SQL 参数[通俗易懂]

    如何从文本文件读入 SQL 参数[通俗易懂]有时我们希望把参数列表分行存储在文本文件里,执行SQL时再拼到in函数里,从而查询出符合条件的记录。 但SQL不能解析文本文件,直接拼到in函数里有困难,所以很多人先把文件导入数据库临时表,再用jo…

    2023-03-03
    163
  • 华为智能会议室,远程办公好帮手[通俗易懂]

    华为智能会议室,远程办公好帮手[通俗易懂]现在疫情这么严重,面对面开会不利于防疫政策,这时候可以试试华为云云会议,相比其他云会议软件,它针对性强,光会议室种类就有了五种。而且应用有多种高科技智能设备,让你感受面对面都没有的方便快捷。 华为云云

    2023-05-11
    148
  • Python import路径简介

    Python import路径简介Python是一种高级动态语言,有着广泛的应用。如果你是一个Python编程爱好者或者正准备学习这门语言,那么本文将会介绍Python import路径的相关知识。在Python中,import语句非常重要。它让你从一个文件中引入到另一个文件,或者从一个模块中引入到另一个模块。但是,当你使用import语句时,如果路径不正确,那么程序就会出错。本文将会介绍如何正确地使用Python的import路径。

    2024-05-30
    104
  • 大数据Hadoop之——Flink的状态管理和容错机制(checkpoint)[亲测有效]

    大数据Hadoop之——Flink的状态管理和容错机制(checkpoint)[亲测有效]一、Flink中的状态 官方文档 有状态的计算是流处理框架要实现的重要功能,因为稍复杂的流处理场景都需要记录状态,然后在新流入数据的基础上不断更新状态。下面的几个场景都需要使用流处理的状态功能: 数据

    2023-05-16
    140

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注