redis设计与实现读书笔记——事务

《Redis设计与实现》读书笔记-客户端 Redis 服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由1/0多路复用技术实现的文件事件处理器,Redis 服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/ 阅读详情

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

  • 事务的实现
  1. 事务开始:redis > MULTI
    def MULTI():
    
        #打开事务标识
        client.flag |= REDIS_MULTI
    
        #返回OK回复
        replyOK()

     

  2. 命令入队:当一个客户端切换到事务状态之后,服务器会根据这个客户端发来的不同命令执行不同的操作:如果客户端发送的命令为EXEC、DISCARD、WATCH、MULIT四个命令中的一个,那么服务器立即执行这个命令;否则,服务器将这个命令放入一个事务队列里面,然后向客户端返回QUEUE回复。
  3. 事务队列:每个Redis客户端都有自己的事务状态,这个事务状态保存在客户端状态的master属性里面:
    typedef struct redisClient{
    
        //……
    
        //事务状态
        multiState mstate;
    
        //……
    }redisClient;
    
    typedef struct multiState{
        
        //事务队列,FIFO顺序
        multiCmd *commands;
    
        //已入队命令计数
        int count;
    
    }multiState;
    
    typedef struct multiCmd{
    
        //参数
        robj **argv;
    
        //参数数量
        int argc;
    
        //命令指针
        struct redisCommand *cmd;
    
    }multiCmd;

     

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

  • WATCH命令的实现

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

  1. 使用WATCH命令监视数据库键
    typedef struct redisDb{
    
        //……
    
        //正在被WATCH命令监视的键
        dict *watched_keys;
    
        //……
    
    }redisDb;

  2. 监视机制的触发
    def toutchWatchKey(db,key):
    
        #如果键key存在于数据库的watched_keys字典中,那么说明至少有一个客户端在监视这个key
        if key in db.watched_keys
    
            #遍历所有监视key的客户端
            for client in db.watched_keys[key]:
    
                #打开标识
                client.flags |= REDIS_DIRTY_CAS

     

  3. 判断事务是否安全

  • 事务的ACID性质
  1. 原子性:与传统的关系型数据库事务支持的原子性不同,redis不支持事务回滚机制,即使事务队列中的某个命令在执行期间出错,整个事务也会继续执行下去,直到事务队列中所有的命令都执行完毕
  2. 一致性
  3. 隔离性
  4. 持久性
使用ShaderGraph制作URP各向异性 URP上用shaderGraph实现各向异性效果,解决只能用shader的问题 阅读详情

相关推荐

Delphi解决 openssl DLL 与 Indy 的SSL/TLS 连接问题

​ 使用 SSL 连接时出错。错误 1409442E:SSL 例程:ssl3_read_bytes:tlsv1 警报协议版本 由于我使用的是最新版本的Indy,根据Delphi Praxis 上的此线程,这种情况不应该发生。事实证明,不知何故,一个非常旧版本的 openssl DLLlibeay32.dll和ssleay32.dll已被放置在我计算机上的 sarch 路径中(版本 1.0.0e)。

Delphi开发局QQ群:32422310 2495

《redis设计与实现》-19事务transaction

一 序     Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 、UNWATCH 5个命令来实现事务功能, 本章首先讨论使用 MULTI 、 DISCARD 和 EXEC 三个命令实现的一般事务, 然后再来讨论带有 WATCH 的事务的实现,最后通过常见的 ACID 性质对 Redis 事务的安全性进行了说明。 二 事务       事务提供了一种“将多个命令...

bohu83的博客 422

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1479

Redis设计与实现 笔记 第十九章 事务

事务 Redis 通过MULTI EXEC WATCH 等命令来实现事务功能. 通过输入 MULTI 开启事务模式,然后输入命令链,最后执行. 19.1 事务的实现 一个事务从开始到结束通常经历一下三个阶段. 1): 事务开始. 2): 命令入队. 3): 事务执行. 19.1.1 事务开始 通过 MULTI 命令来表示事务开始 void multiCommand(redisClient *c) ...

不积跬步无以至千里 256

别再硬编码了!Flowable工作流动态审批人配置全解析(Spring Boot集成版)

本文深入解析Flowable工作流在Spring Boot中的动态审批人配置技术,通过角色、部门等变量实现审批流程的灵活设计。文章详细介绍了架构原理、前端配置映射、动态候选组解析及查询优化方案,帮助企业提升审批流程的适应性和维护效率。

weixin_30919571的博客 136

把 OData V4 服务真正发布出去:事务码 /IWFND/V4_ADMIN 在 SAP S/4HANA On-Premise 里的定位与用法

本文介绍了SAP S/4HANA中的事务码/IWFND/V4_ADMIN,这是SAP Gateway管理OData V4服务的关键工具。该事务码主要负责将后端注册的OData V4服务以服务组形式发布到前端,并维护系统别名路由、测试入口和日志跳转。与OData V2不同,V4采用服务组概念以支持跨服务导航,类似商场统一管理多个专柜。文章还通过实际案例说明,未发布服务组会导致BAS等工具无法发现OData V4服务,并提供了验证服务组状态的访问路径和ABAP示例代码。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 208

Redis设计与实现读书笔记七、发布、订阅和事务的原理

文章目录一、发布与订阅1、频道的订阅与退订1.1 订阅频道1.2 退订频道2、模式的订阅与退订2.1 订阅模式2.2 退订模式3、发送消息3.1 将消息发送给频道订阅者3.2 将消息发送给模式订阅者4、查看订阅信息4.1 PUBSUB CHANNELS4.2 PUBSUB NUMSUB4.3 PUBSUB NUMPAT5、重点回顾二、事务1、事务的实现1.1 事务开始1.2 命令入队1.3 事务队列1.4 执行事务2、WATCH命令的实现2.1 使用WATCH命令监视数据库键2.2 监视机制的触发2.3 .

小宇哥x的博客 292

Office系列完全干净卸载工具合集(最全)

使用 Microsoft Fix it 卸载 Microsoft Office 套件 一、Windows 7、Windows Vista或Windows XP下卸载Office 1.MicrosoftEasyFix50416 工具用来卸载office 2003 MicrosoftEasyFix50416_Office2003.msi 2.MicrosoftEasyFix50154 工具用来卸载office 2007 MicrosoftEasyFix50154_Office2007.msi 3.Microso

业精于勤,荒于嬉 3万+

《Redis设计与实现》读书笔记——发布与订阅、事务、排序、二进制位数组

1、发布与订阅    发布与订阅功能有PUBLISH、SUBSCRIBE、PSUBSCRIBE(正则订阅,订阅某个模式)等命令组成。例如SUBSCRIBE "news.it"、PUBLISH "news.it" "hello"、PSUBSCRIBE "news.[ie]t"等。struct redisServer{ // 保存所有频道的订阅关系,Map<channel,List&l...

weixin_39420024的博客 382

环境仿真软件:EcoPath with Ecosim_(4).Ecosim模型动态模拟

Ecosim 是 EcoPath with Ecosim (EwE) 软件中的动态模拟模块,用于模拟生态系统中各个组分的动态变化过程。Ecosim 模型通过时间序列数据和动态参数,可以预测生态系统在不同管理措施下的响应。时间序列数据的输入:用户可以输入历史数据,如捕捞努力、生物量、环境因子等,用于校准模型。动态参数的设置:用户可以设置被捕食率、生长率、捕捞死亡率等动态参数,以反映生态系统的变化。模拟结果的分析。

kkchenjj的博客 893

【部署】OpenClaw版本降级实操(含全量卸载)

本文详细介绍了OpenClaw工具的降级与卸载方法。主要内容包括:1)通过npm安装指定版本的核心命令及国内镜像加速方案;2)两种卸载路径:CLI工具存在时的简易一键卸载(含交互式与非交互式命令)和手动分步卸载流程;3)CLI已删除但服务仍在运行时,针对macOS(launchd)、Linux(systemd)和Windows(计划任务)系统的具体清理步骤。文章特别强调了卸载前备份的重要性,并提供了不同安装方式(常规安装与源码克隆)的额外说明,确保用户能彻底清理所有组件。

海兰 3174

Redis设计与实现读书笔记---发布订阅/事务/排序/慢查询

发布与订阅 当一个Redis客户端执行PUBLISH 命令将消息message发送给频道channel时,服务器执行如下动作: 将消息message发送给channel频道所以订阅者‘ 如果有一个或多个模式pattern与频道channel相匹配,那么消息message发送给pattern模式的订阅者; 命令 PUBSUB CHANNELS [pattern]:返回服务器当前被订阅的频道; PUBSUB NUMSUB [channel-1 channel-2 channel-n]:接收任意多个频道作为

生蛋的公鸡的博客 218

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集

传感器使用——ESP-WROOM-32 and INMP441麦克风音频采集,数据显示及matlab操作界面。

qq_41958946的博客 7355

实现动态表头_《Redis设计与实现》读书笔记

《Redis设计与实现》读书笔记​www.woojean.com关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外,还需要对合并的结果执行去重复(distinct)操作,最终导致交集操作的实现变得异常复杂。《Redis设计与实现》读书笔记关系数据库并不直接支持交集计算操作,要计算两个集合的交集,除了需要对两个数据表执行合并(join)操作之外...

weixin_35339622的博客 243

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis设计与实现读书笔记

Redis、读书笔记、Redis源码分析、Redis原理分析

一个有信仰的技术人 1338

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《Redis读书笔记》事务设计

文章目录事务demoredis-clijedisredssion应用场景实现思路ACID实现原子性一致性隔离性耐久性总结 事务 一个事务从开始到结束通常会经历以下三个阶段: 事务开始 命令入队 事务执行 demo redis-cli dev-redis:6379> multi OK dev-redis:6379> set "a" "b" QUEUED dev-redis:6379&...

wuhulala的休息室 380

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《redis 设计与实现》读书笔记

大家好,我是烤鸭:     《redis 设计与实现》,读书笔记。 第一部分 数据结构与对象 第2章 简单动态字符串 Redis 使用SDS 作为字符串表示。 O(1) 复杂度获取字符串长度。 杜绝缓冲区溢出。 减少修改字符串长度时所需的内存重分配次数。 二进制安全。 兼容部分C字符串函数。 第3章 链表 每个链表节点由一个listNode结构标识,每个节点都有一个指向前置接点和后置节点的指针,实现是双端链表。 每个链表用list结构标识,结构带有表头节点指针、表尾节

烤鸭的世界我们不懂。 558

《Redis 设计与实现》读书概要

《Redis 设计与实现》读书笔记

u011447403的专栏 1498

《Redis设计与实现》读书笔记

文章目录1. 基本对象2. 底层数据结构3. 对象3.1. 字符串对象3.1.1. int3.1.2. embstr3.1.3. raw3.2. 列表对象3.3. 哈希对象3.4. 集合对象3.5. 有序集合对象3.6. 对象共享4. SDS (simple dynamic string)5. linkedlist6. hashtable7. intset7.1. 升级8. 压缩列表(ziplis...

艰苦奋斗 895

【Redis】《Redis设计与实现》读书笔记

一、简单了解Redis     Redis是以快速读写数据为优势的工具,它是单线程的,占用较少的内存,开源的,以C语言实现的一种Key_Value数据库,在热点数据缓存,限时业务(利用了Redis的键生存时间),游戏排行榜后端服务器等等方面都有应用。 二、Redis的数据结构 2.1 字符串变量     Redis并没...

pointer_y的博客 283

【读书笔记】《Redis设计与实现》

数据结构 Redis支持键可以为String、list、hash、set、zset,5.0版本后还支持Pub/Sub 、Stream、GEO、bitmap、hyperloglogs。 dictEntry节点组成的链表没有指向链表表尾的指针,所以为了速度考虑,程序总是将新节点添加到链表表头位置(头插法时间复杂度O(1),排在其他节点的前面。 当以下条件中的任意一个被满足时,程序会自动开始对哈希表做执行扩展操作:服务器目前没有做BGSAVE/BGREWRITEAOF命令,并且哈希表的负载因子大于等于;服务器目

在路上的德尔菲的博客 274

《redis设计与实现》读书笔记

redis , nosql。 默认port:6379 性能非常高,15W左右的qps。C语言写的。 通常适合做缓存,也可以持久化。 是完全开源的、高性能的分布式内存数据库,基于内存且支持持久化的数据库。 (支持hash、list、set、string、sorted set) 支持数据备份,master-slave模式的数据备份。 redis的所有操作都是原子性的,(要么成功要么不成功)。单个操作...

yeleng的博客 485

redis设计与实现读书笔记

目录 第一部分 数据结构与对象 第1章引 言 第2章 简单动态字符串 第3章 链表 第4章 字典 第5章 跳跃表 第6章 整数集合 第7章 压缩列表 第8章 对象 第二部分 单级数据库的实现 第9章 数据库 第10章 RDB持久化 第11章 AOF持久化 第12章 事件 第13章 客户端 第14章 服务器 第三部分 多机数据库的实现 第15章 复制 第16章 Sentinel 第17章 集群 第四部分 独立功能的实现 第18章 发布与订阅 第19章 事务 第.

逆水行舟,不进则退 681

《redis设计与实现》-读书笔记

文章目录常见数据结构SDS链表字典哈希算法rehash与渐进式rehashrehash步骤:rehash条件渐进式rehash跳跃表整数集合集合升级压缩列表快速列表为什么使用快速列表?ziplist切割大小压缩深度对象内存回收对象共享数据库RDB持久化创建与载入AOF持久化AOF重写事件复制旧版主从复制实现新版主从复制实现主从复制实现心跳检测哨兵模式(Sentinel)发布和订阅Stream事务事务实现ACID性质排序慢日志监视器 常见数据结构 动态字符串SDS 链表 字典 跳跃表 整数集合 压缩列表 快

如是说的博客 1640

《Redis设计与实现》读书笔记--面试全面复习

1. 简单动态字符串 在大多数情况下,Redis 使用 SDS(Simple Dynamic String,简单动态字符串)作为字符串表示 1.1 SDS 的结构体定义 struct sdshdr { // 记录 buf 数组中已使用字节的数量 // 等于 SDS 所保存字符串的长度 int len; // 记录 buf 数组中未使用字节的数量 int free; // 字节数组,用于保存字符串,会自动在数组末尾添加一个字节,用于保存'\0',不计入 le

zhizdk的博客 2113
上一篇: redis设计与实现读书笔记——底层数据结构
下一篇: spring容器加载过程
CCCCC_SSSSS
博客等级 码龄10年 3粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值