Redis事务及网络处理

news2024/12/24 19:41:05

一 Redis事务

redis开启事务后,会把接下来的所有命令缓存到一个单独的队列中,在提交事务时,使这些命令不可被分割的一起执行完成。

如果使用了watch命令监视某一个key,如果在开启事务之后,提交事务之前,有其他连接修改了这个key,那么这个事务在被提交的时候是无法执行的,会返回nil。

以下是redis与事务相关的命令:

#MULTI 开启事务,事务执行过程中,单个命令是入队列操作,直到调用 EXEC 才会一起执行;

MULTI
EXEC #提交事务
DISCARD #取消事务
WATCH #检测 key 的变动,若在事务执行中,key 变动则取消事务;在事务开启前调用,乐观锁实现
      #(cas);若被取消则事务返回 nil ;

watch:

监视某些键, 如果这些键被改变, 就会导致事务被取消. EXEC, DISCARD, UNWATCH都能取消watch对键的监视. 如果不使用watch, 可能会导致自己对键的修改, 覆盖掉别人的修改.

如果在输入watch和输入MULTI之间, 被监视的键被修改, 也会导致事务失败.

lua脚本

lua 脚本实现原子性;redis中加载了一个 lua 虚拟机;用来执行 redis lua 脚本;redis lua 脚本的执行是原子性的;当某个脚本正在执行的时候,不会有其他命令或者脚本被执行;lua 脚本当中的命令会直接修改数据状态;

注意:如果项目中使用了 lua 脚本,不需要使用上面的事务命令;

二 Redis Pipeline

Redis Pipeline是一种通过将多个命令打包成单个请求发送给Redis服务器,以减少客户端和服务器之间的通信次数,从而提高Redis性能的技术。它允许客户端在发送多个命令之前将它们缓冲在本地,然后一次性将它们发送到Redis服务器。Redis服务器按照请求的顺序依次处理每个命令,并将所有命令的响应一次性返回给客户端。

pipeline不具备事务性。

三 Redis事务的ACID特性分析

  1. A 原子性;事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败;为了保持简单且快速, redis不支持回滚;即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。
  2. C 一致性;事务使数据库从一个一致性状态到另外一个一致性状态;这里的一致性是指预期的一致性而不是异常后的一致性;所以redis也不满足;这个争议很大:redis 能确保事务执行前后的数据的完整约束;但是并不满足传统意义上的一致性;比如转账功能,一个扣钱一个加钱;可能出现扣钱执行错误,加钱执行正确,那么最终还是会加钱成功;系统凭空多了钱;
  3. I 隔离性;事务的操作不被其他用户操作所打断;redis 是单线程执行,天然具备隔离性;
  4. D 持久性;redis只有在 aof 持久化策略的时候,并且需要在 redis.conf 中appendfsync=always 才具备持久性;实际项目中几乎不会使用 aof 持久化策略;

因此, Redis的事务, 不具备原子性, 一致性, 持久性, 只满足隔离性;

四 Redis网络层

连接Redis的协议是Redis协议, 其运输层协议是TCP协议.

Redis是一个单线程reactor模型,它的主要逻辑处理是单线程的,但是io操作能够做到多线程处理。所以它可以同时有多个连接。多个连接并发执行。它的多线程模型如下:

img

Redis的所有命令都是原子性的。

五 异步连接Redis

img

协议实现的第一步需要知道如何界定数据包。常用界定数据包有两种方式:

  1. 长度 + 二进制流
  2. 二进制流 + 特殊分隔符

redis混合了这两种界定数据包的方式。server返回数据的时候,返回的数据头是*n\r\n开头,这个n就表明了返回的数据长度是多少。

异步连接

同步连接方案采用阻塞io来实现;优点是代码书写是同步的,业务逻辑没有割裂;缺点是阻塞当前线程,直至redis返回结果。通常用多个线程来实现线程池来解决效率问题。

异步连接方案采用非阻塞io来实现,优点是没有阻塞当前线程,redis 没有返回,依然可以往redis发送命令;缺点是代码书写是异步的(回调函数),业务逻辑割裂,可以通过协程解决(openresty,skynet);配合redis6.0以后的io多线程(前提是有大量并发请求),异步连接池,能更好解决应用层的数据访问性能。

redis6.0 io多线程

redis6.0版本后添加的 io多线程主要解决redis协议的压缩以及解压缩的耗时问题,一般项目中不需要开启。如果有大量并发请求,且返回数据包一般比较大的场景才有它的用武之地。

原理:

int n = read(fd, buff, size);// redis io-threads
msg = decode(buff, size);
data = do_command(msg);
bin = encode(data, sz);// io-threads
send(fd, bin, sz1);

第一行代码表示读取发送给redis的命令,第二行代码表示解析命令,第三行代码表示redis处理命令的逻辑,第四行代码表示对redis返回结果的加密,第五行代码表示将加密好的结果返回给客户端。

可以将第一二四五行代码逻辑交给io线程池处理,以提高效率。

Redis的IO多线程, 可以在配置文件中开启, 同时页可以配置IO线程数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/565873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超级牛散也踩雷!这A股宣布大消息

公司被债权人申请重整一事被法院正式立案7个多月后,5月24日,*ST搜特收到了法院的终结预重整程序通知书和不予受理重整申请裁定书。 消息曝出后,*ST搜特股吧则瞬间炸锅,投资者纷纷留言“完了”、“没盼头了”、“最后的希望终究还…

浅谈IAM——OAuth2.0攻击方法总结

一、OAuth协议介绍 OAuth是一种标准授权协议,它允许用户在不需要向第三方网站或应用提供密码的情况下向第三方网站或应用授予对存储于其他网站或应用上的信息的委托访问权限。OAuth通过访问令牌来实现这一功能。 1.发展历史 OAuth协议始于2006年Twitter公司OpenI…

车载以太网 - SomeIP - 协议用例 - BehaviorBasic

目录 Service Discovery Communication Behavior 1、验证DUT启动后的重复报文阶段,2帧offer报文之间的时间间隔为上次的2倍<

【模型预测】A-4D战斗机姿态控制的模型预测控制方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java中的类加载机制

Java中的类加载机制 类的生命周期 ​ 一个类型从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期将会经历加载&#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xff08;Preparation&#xff09;、解…

C++ thread编程(Linux系统为例)—thread成员函数与thread的创建方法

c 11 之后有了标准的线程库&#xff1a;std::thread。 参考thread库的使用 成员函数 构造函数 thread的构造函数有下面四个重载 默认构造函数 thread() noexcept初始化构造函数 template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&a…

Linux命令(21)之usermod

Linux命令之usermod 1.usermod介绍 usermod命令用来更改/etc/passwd或/etc/shadow文件下用户属性&#xff0c;包括但不限于shell类型、用户id&#xff0c;用户gid、家目录、锁定及解锁用户等等。 2.usermod用法 usermod [参数] [用户名] usermod常用参数 参数说明-u修改UID…

淘宝/天猫商品评论数据采集

淘宝商品评论API接口是指允许开发者通过API接口获取淘宝商品的评价信息的一种技术手段。通过使用这个接口&#xff0c;开发者可以快速获取淘宝商品的评价信息&#xff0c;以实现自己的商业用途。 淘宝商品评论API接口需要开发者提供相应的数据访问权限&#xff0c;包括授权和Ap…

Linux命令(22)之chage

Linux命令之chage 1.chage介绍 usermod命令用来更改linux用户密码到期信息&#xff0c;包括密码修改间隔最短、最长日期、密码失效时间等等。 2.chage用法 chage常用参数 参数说明-m密码可更改的最小天数&#xff0c;为0表示可以随时更改-M密码有效期最大天数-W密码到期前提…

代理模式 静态代理 JDK动态代理 Cglib动态代理

1.静态代理 总共只有两个类&#xff0c;代理类和被代理类。其中代理类是被代理类的增强和扩展 被代理的类C和代理类B都要实现同一个接口 代理类B中调用代理类C中相同的方法 interface D {public void function1(); }class C implements D {Overridepublic void function1(…

PyQt5桌面应用开发(18):自定义控件界面设计与实现

本文目录 PyQt5桌面应用系列定制控件-界面设计本文目标功能分析 功能设计绘制方形图案鼠标交互事件和属性 完整代码总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循环 …

chatgpt赋能python:PythonTile:一种强大的界面构建工具

Python Tile&#xff1a;一种强大的界面构建工具 Python Tile是一种基于Python编程语言的界面构建工具&#xff0c;其目的是帮助开发者快速创建精美的用户界面&#xff0c;从而提高应用程序的用户体验。本文将介绍Python Tile的功能和优势&#xff0c;并讨论其在实际开发中的应…

Doris数据库BE——LoadChannelMgr原理解析

数据在经过清洗过滤后&#xff0c;会通过Open/AddBatch请求分批量将数据发送给存储层的BE节点上。在一个BE上支持多个LoadJob任务同时并发写入执行。LoadChannelMgr负责管理这些任务&#xff0c;并对数据进行分发。 internal service Open/AddBatch请求接口使用BRPC&#xff…

STP 生成树协议

STP&#xff08;Spanning-Tree Protocol&#xff09;的来源 在网络三层架构中&#xff0c;我们会使用冗余这一技术&#xff0c;也就是对三层架构中的这些东西进行备份。冗余包含了设备冗余、网关冗余、线路冗余、电源冗余。 在二层交换网络中进行线路冗余&#xff0c;如图&am…

Linux :: 【基础指令篇 :: 用户管理:(2)】::设置用户密码(及本地Xshell 登录云服务器操作演示) :: passwd

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 目录索引&#xff1a; 1. 基本语法 2. 基本用法 3. 注意点 4. 补充&#xff1a;指定用户设置密码操作实例测试及登录本地 Xshell 登录演…

Linux命令(18)之file

Linux命令之file 1.file介绍 file命令用来识别文件类型。 2.file用法 file [参数] [文件或目录] file常用参数 参数说明-L显示符号廉洁所指向文件的类别-i显示MIME类别-b显示结果时&#xff0c;不显示文件名称 3.实例 3.1显示ztj.sh文件类型 3.2显示ztj.sh文件类型(不显示…

记一次docker中的oracle连接问题

起因是客户登陆时报错TNS-12537 登陆上上服务器后&#xff0c;发现了几个特点。 1、没有oracle用户 2、数据文件的位置和spfile里面写的不一样 3、pmon进程存在&#xff0c;但是父进程ID不是1 4、配置oracle用户及环境变量&#xff0c;但是as sysdba无法登录到数据库 查看…

Linux命令(19)之userdel

Linux命令之userdel 1.userdel介绍 userdel命令用来说删除useradd命令创建的Linux账户。 useradd创建用户&#xff1a; Linux命令(15)之useradd_小黑要上天的博客-CSDN博客 2.userdel用法 userdel [参数] [用户账户名称] userdel常用参数 参数说明-r递归删除&#xff0c;…

【网络编程】协议定制+Json序列化与反序列化

目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议&#xff0c;如何保证接收方收到了完整的报文呢&#xff1f; 2.2自定义协议的实现 2.3自定义协议在客户端与服务器中的实现 三、使用Json进行序列化和反序列化 3.1jsoncpp库的安装 3.2改造…