当前位置: 首页 > news >正文

购物网站建设成本/专业做网站官网

购物网站建设成本,专业做网站官网,江门网站建设哪家快,wordpress七牛cdn w3tc事务的实现概述事务的实现事务开始命令入队事务队列执行事务概述 Redis事务没有回滚机制 Redis通过MULTI,EXEC,WATCH等命令来实现事务功能。、 事务首先以一个MULTI命令开始,然后将多个命令放入事务中,最后由EXEC命令将这个事务提…

事务的实现

  • 概述
  • 事务的实现
    • 事务开始
    • 命令入队
    • 事务队列
    • 执行事务

概述

Redis事务没有回滚机制
Redis通过MULTI,EXEC,WATCH等命令来实现事务功能。、
事务首先以一个MULTI命令开始,然后将多个命令放入事务中,最后由EXEC命令将这个事务提交给服务器执行

事务的实现

一个事务从开始到结束通常会经历以下三个阶段:

  1. 事务开始
  2. 命令入队
  3. 事务执行

事务开始

MULTI命令的执行标志着事务的开始

redis> MULTI
OK

MULTI命令 可以 执行该命令的客户端 从 非事务状态 切换至 事务状态
这一切换 是通过 在客户端状态的flags属性中 打开 REDIS_MULTI标识 来完成的
MULTI命令的实现可以用以下伪代码来表示:

def MULTI():# 
打开事务标识client.flags |= REDIS_MULTI# 
返回OK
回复replyOK()

命令入队

当一个客户端 处于 非事务状态时,这个客户端发送的命令会立即被服务器执行,如下:

redis> SET "name" "Practical Common Lisp"
OK
redis> GET "name"
"Practical Common Lisp"
redis> SET "author" "Peter Seibel"
OK
redis> GET "author"
"Peter Seibel"

与此不同的是,当一个客户端切换到事务状态之后,服务器会根据这个客户端发来的不同命令执行不同的操作:

  • 如果客户端发送的命令为EXEC、DISCARD、WATCH、MULTI四个命令的其中一个,那么服务器立即执行这个命令
  • 如果客户端发送的命令是EXEC、DISCARD、WATCH、MULTI四个命令 以外的 其他命令,那么服务器 并不立即执行 这个命令,而是将 这个命令 放入 一个事务队列里面,然后 向客户端返回 QUEUED(已排队)回复

服务器判断命令是该入队还是该立即执行的过程可以用流程图,如下:
在这里插入图片描述

事务队列

每个Redis客户端都有自己的事务状态(不是一个简单的状态数值),这个事务状态 保存在 客户端状态的mstate属性里面

typedef struct redisClient {// ...// 事务状态multiState mstate;    /* MULTI/EXEC state */// ...
} redisClient;

事务状态包含一个事务队列,以及一个已入队命令的计数器(也可以说是事务队列的长度)

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

事务队列是一个multiCmd类型的数组
数组中的每个multiCmd结构 都保存了 一个 已入队命令的相关信息,包括:指向命令实现函数的指针、命令的参数,以及参数的数量

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

事务队列以先进先出(FIFO)的方式保存入队的命令,较先入队的命令会被放到数组的前面,而较后入队的命令则会被放到数组的后面
如果客户端执行以下命令

redis> MULTI
OK
redis> SET "name" "Practical Common Lisp"
QUEUED
redis> GET "name"
QUEUED
redis> SET "author" "Peter Seibel"
QUEUED
redis> GET "author"
QUEUED

那么服务器将为客户端创建如下的事务状态:

  • 最先入队的SET命令被放在了事务队列的索引0位置上
  • 第二入队的GET命令被放在了事务队列的索引1位置上
  • 第三入队的另一个SET命令被放在了事务队列的索引2位置上
  • 最后入队的另一个GET命令被放在了事务队列的索引3位置上

在这里插入图片描述

执行事务

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

对于上面的事务队列,服务器首先会执行命令

SET "name" "Practical Common Lisp"

接着执行命令

GET "name"

之后执行命令

SET "author" "Peter Seibel"

再之后执行命令

GET "author"

最后,服务器会将执行这四个命令所得的回复返回给客户端

redis> EXEC
1) OK
2) "Practical Common Lisp"
3) OK
4) "Peter Seibel"

EXEC命令的实现原理可以用以下伪代码来描述:

def EXEC():# 
创建空白的回复队列reply_queue = []# 
遍历事务队列中的每个项# 
读取命令的参数,参数的个数,以及要执行的命令for argv, argc, cmd in client.mstate.commands:# 
执行命令,并取得命令的返回值reply = execute_command(cmd, argv, argc)# 
将返回值追加到回复队列末尾reply_queue.append(reply)# 
移除REDIS_MULTI
标识,让客户端回到非事务状态client.flags & = ~REDIS_MULTI# 
清空客户端的事务状态,包括:#1 
)清零入队命令计数器#2 
)释放事务队列client.mstate.count = 0release_transaction_queue(client.mstate.commands)# 
将事务的执行结果返回给客户端send_reply_to_client(client, reply_queue)
http://www.lbrq.cn/news/1603675.html

相关文章:

  • 抖音代运营会不会看到以往的数据/长沙百度搜索排名优化
  • 购物车网站设计/全网营销推广案例
  • 做淘客都有什么网站/cfa三级和一二级关系大吗
  • 海洋高端的专业做网站/域名注册流程和费用
  • 株洲网站制作建设/b2b网站有哪些平台
  • 西安商城网站制作/百度数字人内部运营心法曝光
  • 网站死链/迈步者seo
  • 天津住房和城乡建设厅官方网站/网址外链平台
  • 内衣网站建立/做百度推广多少钱
  • 建设部网站建筑工程质保期/长春做网站公司长春seo公司
  • 如何建网站教程/可以看国外网站的浏览app
  • 各大网站投稿/员工培训课程
  • 网站为什么没有排名了/seo网站内部优化
  • 道真县城乡建设局网站/苏州网站制作开发公司
  • 外国做袜子的网站/线上推广具体应该怎么做
  • 做自媒体查找素材的网站/网站seo优化课程
  • 国务院关于网站建设/百度app安装
  • 小白测评做网站/百度 营销中心
  • 如何在电脑上建立网站/谷歌下载
  • 中国日报网英文官方网站建设/中国制造网网站类型
  • 南通网站建设系统方案/西安网络推广外包公司
  • 手机怎样做网站/网站关键词优化建议
  • 网络专业的网站建设/福州seo网络推广
  • 灯饰网站建设/seowhy教研室
  • 猪八戒wordpress/常熟seo关键词优化公司
  • 网站设计导航栏怎么做/怎么自己建立网站
  • 域名手机网站源码/百度游戏中心app
  • 做网站经验/seo教程技术优化搜索引擎
  • 股票网站排名哪个好/岳阳seo
  • 武汉专业建站注意事项/运营培训
  • 从exec到Shell:深度解析Linux进程等待,程序替换与自主Shell实现
  • 常见的框架漏洞(Thinkphp,spring,Shiro)
  • [硬件电路-148]:数字电路 - 什么是CMOS电平、TTL电平?还有哪些其他电平标准?发展历史?
  • Azure DevOps 中的代理
  • SpringBoot与TurboGears2跨栈、整合AI服务、智能客服路由系统整合实战
  • 【Android】通知