Redis事务及网络处理

一 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线程数量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS:队列

目录 前言一、队列简介1.1数据存储1.2多任务访问1.3出队阻塞1.4入队阻塞1.5队列操作过程图示1.5.1创建队列1.5.2向队列发送第一个消息1.5.3向队列发送第二个消息1.5.4从队列中读取消息 二、队列结构体三、队列创建3.1创建函数3.2函数xQueueCreateStatic()3.3函数xQueueCreate()…

Spring Security入门

1. Spring Security 简介 Spring Security 是一个高度可定制的身份验证和访问控制框架,它基于 Spring 框架,并可与 Spring 全家桶无缝集成。该框架可以精确控制用户对应用程序的访问,控制用户的角色和权限等。 Spring Security 最早是由 Be…

又名管道和无名管道

一、进程间通信(IPC,InterProcess Communication) 概念:就是进程和进程之间交换信息。 常用通信方式 无名管道(pipe) 有名管道 (fifo) 信号(signal) 共…

JMeter性能测试:JMeter多用户并发模拟及压测结果分析

目录 JMeter设置 JMeter线程组 JMeter压测实例 View Results Tree Aggregate Report 命令行方式执行压测 jtl文件解析 JMeter多用户并发模拟 JMeter设置 多用户并发数的多少与计算机内存有关,设置 jmeter.bat (Windows) 或者 jmeter.sh (Linux):…

Faster R-CNN网络架构详解和TensorFlow Hub实现(附源码)

文章目录 一、RPN网络1. RPN网络简介2. backbone网络简介 二、Faster R-CNN网络架构1. Faster R-CNN网络简介2. 基于TensorFlow Hub实现Faster R-CNN 前言:Faster R-CNN的简介见 上一篇文章 一、RPN网络 1. RPN网络简介 RPN网络全称Region Proposal Network&#…

vscode配置flutter开发环境,不需要安装第三方安卓模拟器

文章目录 1.获取Flutter SDK2.配置Android环境3. 在Android Studio配置Android设备3.1 进入Device Manager配置安卓设备3.2 创建安卓虚拟机3.3 选择x86 镜像3.4 配置硬件加速3.5 启动模拟器 4.配置vscode1.安装 Flutter 和 Dart 插件 5. 新建flutter程序创建应用 6.启动程序1.选…

nodejs+vue社区母婴幼儿用品商城系统

本系统实现了管理员对用户、商品信息、交流论坛、订单信息的管理,是为了满足用户更深层次的需求。除了上述优势外,本系统还具有:查询迅速,搜索资料方便,可靠性强等等在如今这个高速发展的时代,效率决定着你…

day10 - 使用canny算子进行人像勾勒

本期主要介绍canny算子,了解canny算子的流程以及各个流程的原理和实现。 ​ 完成本期内容,你可以: 了解canny算子的流程和应用 若要运行案例代码,你需要有: 操作系统:Ubuntu 16 以上 或者 Windows10 工…

第五篇、基于Arduino uno,获取超声波(HC04)传感器的距离数据——结果导向

0、结果 说明:先来看看串口调试助手显示的结果,显示的是一个距离值,如果是你想要的,可以接着往下看。 1、外观 说明:虽然超声波传感器形态各异,但是原理和代码都是适用的。 2、连线 说明:只…

秒杀系统常见问题—如何避免库存超卖?

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 先看问题 首先上一串代码 …

Vue.js 比较重要知识点总结一

概述 谈一谈你对 Vue.js 的响应式数据的理解Vue3 出现解决了什么问题?它有哪些优势?Vue3 新特性有哪些vue2 和 vue3 的响应式有什么区别? 谈一谈你对 Vue.js 的响应式数据的理解 Vue 2.x 对象类型:通过 object.defineProperty(…

实时频谱-3.1实时频谱分析仪测量

RSA 测量类型 泰克RSA 可以在频域、时域、调制域和统计域中工作。 频域测量 基本频域测量是实时 RF 数字荧光显示(DPX)频谱显示测量、频谱显示测量和频谱图显示测量功能。 DPX 频谱 DPX 频谱测量对 RSA 发现其它分析仪漏掉的难检信号的能力至关重要。在所有泰克 RSA 中&am…

SAP-MM-内向外向交货单

1、内向&外向交货单概念 外向交货(outbound delivery)是用在客户与企业之间的交货单,而内向交货(inbound delivery)则是用在供应商与企业之间的交货单;换言之,外向交货多用于SD 模块&#…

PriorityQueue优先级队列

前言 优先级队列就是在堆的基础上进行改造,那么什么是堆,又什么是优先级队列呢? 我们一起来看看吧! 目录 前言 一、堆 (一)堆的创建 (二)堆的插入 (三)堆…

群晖DS920 video station使用教程

群晖DS920 video station使用教程 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 安装video station在群晖套件里点一下就好,这里不说了。 一、添加视频库 可以添加电视剧、电视节目等类型。 比如我在国产剧这个视频…

uniapp滚动加载 下拉刷新

前言 在日常开发中,滚动加载和下拉刷新是非常常见的功能,页面数据过多时,需要滚动加载优化性能,本篇技术分享博客将介绍如何在uniapp中实现滚动加载和下拉刷新。 预览 滚动加载 下拉刷新 一、滚动加载 滚动加载指的是当用户滑…

PHP 反序列化漏洞

PHP反序列化漏洞在实际测试中出现的频率并不高,主要常出现在CTF中。 PHP序列化概述 PHP序列化函数: serialize:将PHP的数据,数组,对象等序列化为字符串unserialize:将序列化后的字符串反序列化为数据&…

java 利用poi根据excel模板导出数据(二)

本文是 java 利用poi根据excel模板导出数据(一) 的续篇 经常有poi的开发一定会碰到三个名词: HSSFWorkbook 、 XSSFWorkbook、SXSSFWorkbook; 这三个都是导出excel的形式,具体区别: HSSFworkbook,XSSF…

Golang每日一练(leetDay0080) 矩形面积、翻转二叉树

目录 223. 矩形面积 Rectangle Area 🌟🌟 226. 翻转二叉树 Invert Binary Tree 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

SAP-MM-采购申请-价值特性

采购申请审批在维护价值特性时要注意是抬头价值还是行价值,要确定选择哪个,配置时对应配置。 1、创建价值特性CT04 字段名称:CEBAN-GSWRT,和CEBAN-GFWRT 抬头总价值:CEBAN-GFWRT;如果选择的是抬头审批&am…