redis 事务实现原理

2023-11-09

一:简介

Redis事务通常会使用MULTI,EXEC,WATCH等命令来完成,redis实现事务实现的机制与常见的关系型数据库有很大的却别,比如redis的事务不支持回滚,事务执行时会阻塞其它客户端的请求执行。

二:事务实现细节

redis事务从开始到结束通常会通过三个阶段:

1.事务开始
2.命令入队
3.事务执行
我们从下面的例子看下

redis > MULTI 
OK

redis > SET "username" "bugall"
QUEUED

redis > SET "password" 161616
QUEUED

redis > GET "username"

redis > EXEC
1) ok
2) "bugall"
3) "bugall"
redis > MULTI 

标记事务的开始,MULTI命令可以将执行该命令的客户端从非事务状态切换成事务状态,这一切换是通过在客户端状态的flags属性中打开REDIS_MULTI标识完成,
我们看下redis中对应部分的源码实现

void multiCommand(client *c) {
    if (c->flags & CLIENT_MULTI) {
        addReplyError(c,"MULTI calls can not be nested");
        return;
    }
    c->flags |= CLIENT_MULTI;   //打开事务标识
    addReply(c,shared.ok);
}

在打开事务标识的客户端里,这些命令,都会被暂存到一个命令队列里,不会因为用户会的输入而立即执行

<
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis 事务实现原理 的相关文章

  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • socket.io redis 和内存泄漏

    我的socket io版本是 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection 我在 Windows 上 在某些地方 我看到问题已得到解决 我
  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • Redis 块推送直到列表有空位

    我正在寻找类似的东西BLPUSH该命令将阻塞 直到列表的长度低于指定值max size 目的是防止生产者运行速度快于消费者时列表无限增长 功能与 python 非常相似Queue put https docs python org 3 li
  • 使用 AWS ElastiCache 请求中的 Airflow CROSSSLOT 密钥未散列到同一插槽错误

    我在 AWS ECS 上运行 apache airflow 1 8 1 并且有一个 AWS ElastiCache 集群 redis 3 2 4 运行 2 个分片 2 个启用多可用区的节点 集群 Redis 引擎 我已经验证气流可以毫无问题
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • 是否有可嵌入的 Java 替代 Redis?

    根据这个线程 https stackoverflow com questions 3047010 best redis library for java 如果我想从Java中使用Redis Jedis是最好的选择 然而 我想知道是否有任何库
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • 有没有办法让特定的key在集群模式下定位到特定的redis实例上?

    我想让我的多锁位于不同的redis实例上 我发现redission可以指定一个实例来执行命令 但是如果该命令与key相关 则指定的实例会将命令传输到另一个实例 你能给我一些建议吗 你可以 但这并不是微不足道的 首先 Redis 在键中使用大
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • Spring Redis删除不删除key

    我正在尝试删除一个 Redis 键 但由于某种原因它没有删除 但也没有抛出异常 这是我要删除的代码 import com example service CustomerService import com example model Cu
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一

随机推荐

  • pyspark指定schema

    通过StructType对象指定DataFrame的Schema 没有嵌套结构的json jsonString id 01001 city AGAWAM pop 15338 state MA id 01002 city CUSHMAN po
  • r语言 col_co,cob,col,con,cor,cog前缀其实都是com变化而已

    c开头前缀有co cob col com con cor cog等 哪它们有什么关联呢 下面我们来分析 come 英 k m 美 k m v 来 来到 到达 com前缀可以看成come变化而成 全部来到就是聚集到一起 表聚集 加强 强调的
  • select函数使用浅析

    一 函数原型及参数说明 int select int maxfdp fd set readfds fd set writefds fd set errorfds struct timeval timeout 返回值 负值 select错误
  • VIM-Plug安装插件时,频繁更新失败,或报端口443被拒绝

    安装vim插件 tabular时候一直报错 尝试了网上大部分办法 全部失败 方法 直接按照报错的内容自己手动操作 错误如下图 第一步 去github检查插件的网址有没有问题 直接复制网址浏览器搜索 若长时间加载不上 使用科学上网 第二步 若
  • 重写equals方法

    重写equals方法 相信在每个人都有过重写过java的equals的方法的经历 这篇博文就从以下几个方面说明重写equals方法的原由 与君共进步 一 为什么要重写equals方法 首先我们了解equals方法的作用是什么 java的官方
  • [论文笔记] GENDA: A Graph Embedded Network Based Detection Approach on encryption algorithm

    GENDA A Graph Embedded Network Based Detection Approach on encryption algorithm of binary program JISA 2022 Xiao Li Scho
  • 关闭apache-httpClient日志遇到的坑

    log4j logger org OFF log4j logger httpclient OFF 看org apache commons httpclient Wire源码才知道他没有遵循类名 httpclient wire public
  • requests、aiohttp、httpx性能大比拼

    在Python中 有许多用于发送HTTP请求的库 其中最受欢迎的是requests aiohttp和httpx 这三个库的性能和功能各不相同 因此在选择使用哪个库时 需要考虑到自己的需求和应用场景 首先 让我们来了解一下这三个库的基本介绍
  • 科技,让二次元老婆动起来

    想让你的二次元老婆动起来吗 前不久 Meta 也就是Facebook 发布了一款有趣的AI工具Animated Drawings 它可以让静态的儿童画动起来 有些懂行的朋友一看就说 哎呀这不就是关键点检测再加动态化嘛 道理是这个道理 但是儿
  • MYSQl:关于AUTO_INCREMENT

    auto increment是用于主键自动增长的 从1开始增长 当你把第一条记录删除时 再插入第二条数据时 主键值是2 不是1 问题来源 拷贝了公司项目的regions表 发现建表的sql语句如下 CREATE TABLE es regio
  • 两数求最大值 和 交换两个数字

    两数求最大值 include
  • 将图片进行base64 编码后的数据进行读取,以io流的方式传给前台并显示出来并且不断刷新图片

    前提摘要 最近做一个项目 是关于slam的 给slam发送构建地图的命令 slam不断返回json串 而地图的图片在json串中已经经过base64编码了 我这边需要将base64编码解析并以流的方式传给前台显示出来 但是消息是不断要接收的
  • 支付结算周期:D0 D1 T0 T1的区别

    D0 自然日当天 D1 自然日第二天 T0 工作日当天 T1 工作日第二天 D0和T0的区别 比如说 星期六做的交易 D0因为是自然日当天 所以周六即可到账 T0因为是工作日当天 所以下周一可到账
  • 在Windows10下配置深度学习环境(tensorflow-gpu + CUDA & CUDNN),十分详细,推荐小白食用

    在Windows10下配置深度学习环境 tensorflow gpu CUDA CUDNN 本文的基础建立在DUT汽院515教研室的师兄的教程之上 由本人总结更新 希望能帮到更多人 十分感谢师兄们的付出 CUDA的配置 请参考本人的另一篇文
  • 基于LSTM的情感识别在鹅漫评论分析中的实践与应用

    深度学习 深度神经网络 作为机器学习的一个重要分支 持续推动了很多领域的研究和应用取得新的进展 其中包括文本处理领域的情感分类问题 由于可以对文本进行更有效的编码及表达 基于深度学习的情感分类对比传统的浅层机器学习和统计学方法 可以取得更高
  • C++ public、protected 、 private使用详解

    1 类私有成员变量的访问 必须调用类成员函数来进行访问 对于protected成员 继承他的类可以直接在成员函数中调用 而对于私有成员 继承他的类要使用他们的值必须使用基类的成员函数 2 protected成员 基类对象不能调用自身prot
  • ajax中data参数json对象与json字符串的使用区别

    在jquery的ajax里面有个data参数 是客户的传给服务端的数据 我们先看第一种常见写法 前端代码 var username phone email num val var pwd password val ajax url logi
  • GDB 调试工具的使用和交叉编译安装

    作用 1 可以让我们的代码单步运行 并且可以打印出运行时各种变量的值 2 还可以调试各种 core 核心 文件 在启动 gdb 调试程序的时候 我们需要使用到 gcc g 命令指定 g 参数生成可执行调试程序 例如 g g main cpp
  • Proxy代理isExtensible方法

    介绍 isExtensible方法拦截Onject isExtensible操作 demo1 var p new Proxy isExtensible function target console log called return tr
  • redis 事务实现原理

    一 简介 Redis事务通常会使用MULTI EXEC WATCH等命令来完成 redis实现事务实现的机制与常见的关系型数据库有很大的却别 比如redis的事务不支持回滚 事务执行时会阻塞其它客户端的请求执行 二 事务实现细节 redis