Redis协议与异步方式

news2024/11/23 1:30:32
Rredis Pipeline

redis pipeline 是一个客户端提供的机制,而不是服务端提供的;
pipeline 不具备事务性;
目的:节约网络传输时间
通过一次发送多次请求命令,从而减少网络传输的时间。

Redis发布订阅

为了支持消息的多播机制,redis 引入了发布订阅模块;
消息不一定可达;分布式消息队列; stream 的方式确保一定可
达;

服务器和Redis建立多少链接?

  1. 使用5种基本数据结构处理,可以使用连接池(更快)
  2. 阻塞命令 brpop
  3. 监听发布者模式 sub/pub

应用:

发布订阅功能一般要区别命令连接重新开启一个连接;

因为命令连接严格遵循请求回应模式;而 pubsub 能收到 redis 主动推送的内容;

所以实际项目中如果支持 pubsub 的话,需要另开一条连接用于处理发布订阅;

缺点: 不确保消息到达,不会持久化 使用stream, kafka分布式消息队列

发布订阅的生产者传递过来一个消息,redis 会直接找到相应的消费者并传递过去;假如没有消费者,消息直接丢弃;假如开始有2个消费者,一个消费者突然挂掉了,另外一个消费者依然能收到消息,但是如果刚挂掉的消费者重新连上后,在断开连接期间的消息对于该消费者来说彻底丢失了;

另外,redis 停机重启,pubsub 的消息是不会持久化的,所有
的消息被直接丢弃;

redis 事务: 只有一条连接服务器时,不需要考虑事务,因为串行执行

事务:用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元要么全部执行,要么全部不执行,是不可分割的工作单元

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

乐观锁实现,所以失败需要重试,增加业务逻辑的复杂度;

  • MULTI:开启事务 begin / start transaction
  • EXEC:提交事务 commit multiexec中的Redis指令将作为一个整体执行
  • DISCARD: 取消事务 rollback
  • WATCH:监测key变动,若在事务中执行,key变动则取消事务;在事务开启前调用,乐观锁实现(CAS);若被取消事务则返回nil

以上操作在业务中不会使用,一般都使用lua脚本

ACID特性分析(理解性背诵)

A 原子性:事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败;Redis 不支持回滚;即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。

C 一致性(完整约束的一致、用户逻辑的一致):事务的前后,所有的数据都保持一个一致的状态,不能违反数据的一致性检测;这里的一致性是指预期的一致性而不是异常后的一致性;所以 Redis 也不满足;这个争议很大:Redis 能确保事务执行前后的数据的完整约束;但是并不满足业务功能上的一致性;比如转账功能,一个扣钱一个加钱;可能出现扣钱执行错误,加钱执行正确,那么最终还是会加钱成功;系统凭空多了钱;

I 隔离性;各个事务之间互相影响的程度;Redis 是单线程执行,天然具备隔离性;

D 持久性;Redis 只有在 AOF 持久化策略的时候,并且需要在redis.confappendfsync=always 才具备持久性;实际项目中几乎不会使用 AOF 持久化策略;

面试时候回答:lua 脚本满足原子性和隔离性一致性和持久性不满足;

Lua脚本

Lua 脚本实现原子性;

Redis 中加载了一个 Lua 虚拟机;用来执行 Redis Lua 脚本;Redis Lua 脚本的执行是原子性的;当某个脚本正在执行的时候,不会有其他命令或者脚本被执行;

Lua 脚本当中的命令会直接修改数据状态;

Lua 脚本 MySQL 存储区别:MySQL存储过程不具备事务性,所以也不具备原子性;

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

EVAL
# 测试使用
script numkeys key [key ...] arg [arg ...]
EVAL
# 线上使用
EVALSHA sha1 numkeys key [key ...] arg [arg ...]

在这里插入图片描述

在这里插入图片描述

异步连接:

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

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

异步连接性能测试:

在这里插入图片描述

同步连接性能测试:

在这里插入图片描述

怎么实现异步连接?
  1. 另起线程
  2. reactor
    • Redis建立连接 connect(fd, &addr, &len) 使用非阻塞IO
      • 创建socket,设置fd为非阻塞
      • connect -1, errno = EINPROGRESS
      • fd注册到epoll, 写事件
      • 如果连接建立成功,fd的写事件进行响应
    • Redis发送数据,使用Redis协议加密,通过tcp发送过去
      • 直接write, int n = write(fd, buf, sz); if (n < sz && n != -1)部分数据没有发送,说明fd对应的缓冲区已满
      • 注册写事件,如果写事件出发,继续发送未完成的数据;如果全部发送,注销写事件
      • 注册读事件
    • 读取Redis的返回,通过tcp接收数据,分割数据包(粘包处理),Redis协议解密
      • 读事件触发,int n = read(fd, buf, sz)
      • 根据Redis协议,分割数据包
  3. proactor

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

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

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

相关文章

文件传送协议

壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议&#xff1b; 在互联网发展的早期阶段&#xff0c;用FTP传送文件约占整个互联网的通信量的三分之一&#xff1b;知道1995年&#xff0c;www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…

删除链表中等于给定值 val 的所有结点(三种方法深入解析)

又见面啦&#xff0c;接下来的链表相关Oj题目我会根据我自己的理解来给大家讲解&#xff0c;包括解析和代码&#xff0c;希望你可以对链表有更加深入的理解&#xff01;&#xff01; 题目&#xff1a; 先上链接&#xff1a; OJ题目 给你一个链表的头节点 head 和一个整数 va…

ICode国际青少年编程竞赛- Python-1级训练场-路线规划

ICode国际青少年编程竞赛- Python-1级训练场-路线规划 1、 Dev.step(3) Dev.turnLeft() Dev.step(4)2、 Dev.step(3) Dev.turnLeft() Dev.step(3) Dev.step(-6)3、 Dev.step(-2) Dev.step(4) Dev.turnLeft() Dev.step(3)4、 Dev.step(2) Spaceship.step(2) Dev.step(3)5、…

欧拉回路(leetcode 重新安排行程)

先学习一下欧拉回路是怎么一回事。 对于图中这七个节点&#xff0c;从节点1出发&#xff0c;最终要到达节点1&#xff0c;并且每条路只能走一次&#xff0c;且每条路都得走过一次。 使用dfs&#xff0c;如果算法按照字典序的排列方式选择下一个节点。 第一部分&#xff1a;那…

VS Code 保存+格式化代码

在 VSCode 中&#xff0c;使用 Ctrl S 快捷键直接保存并格式化代码&#xff1a; 打开 VSCode 的设置界面&#xff1a;File -> Preferences -> Settings在设置界面搜索框中输入“format on save”&#xff0c;勾选“Editor: Format On Save”选项&#xff0c;表示在保存…

CUDA内存访问模式

大多数设备端数据访问都是从全局内存开始的&#xff0c;并且多数GPU应用程序容易受内存带宽的限制。因此&#xff0c;最大限度的利用全局内存带宽是调控核函数性能的基本。 对齐与合并访问 如图&#xff0c;所有的应用程序数据最初存在于DRAM上&#xff0c;也就是物理设备内存上…

【HTTP上】协议/域名/url/请求和响应/状态码/重定向

文章目录 0.应用层协议0.1HTTP协议 1.域名2.DNS3.访问浏览器4.URL搜索特殊字符如#&~ 5.万维网6.http请求和响应的格式6.1HTTP请求格式6.2HTTP响应格式6.3示例6.3模拟HTTP【框架】6.4查看请求或响应的工具FiddlerPostman 7.网页7.0对访问网页的认识7.1wget7.2新的认识7.3GET…

使用DataGrip连接DM达梦数据库

目录 前言一、添加数据库驱动1.1 配置达梦驱动包1.1.1 配置达梦驱动1.1.2 配置驱动jar包 1.2 配置JDBC URL模板1.3 保存驱动配置 二、新建数据源2.1 填写数据库连接信息2.2 测试是否配置成功2.3 保存配置并退出 前言 达梦数据库虽然提供了官方的数据库管理工具"DM管理工具…

数据挖掘实战-基于CNN深度学习算法构建英文文本分类模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

零基础学习数据库SQL语句之操作表中数据的DML语句

我们的数据库是根据页面原型和相关需求完成相关开发的 在表中添加数据 删除数据 修改数据 添加数据 页面模型 当点击保存的时候就能将表单数据提交到服务端 服务端将数据添加到数据库 我们要用insert语句 将数据添加到数据库中 代码演示 CREATE DATABASE Dduo; USE Dduo…

【资源分享】CAD Map 3D2024安装教程

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

Elasticsearch:探索 11 种流行的机器学习算法

作者&#xff1a;来自 Elastic Elastic Platform Team 过去几年中&#xff0c;机器学习&#xff08;ML&#xff09;已经悄然成为我们日常生活中不可或缺的一部分。它影响着从购物网站和流媒体网站上的个性化推荐&#xff0c;到保护我们的收件箱免受我们每天收到的大量垃圾邮件的…

docker compose mysql主从复制及orchestrator高可用使用

1.orchestrator 功能演示&#xff1a; 1.1 多级级联&#xff1a; 1.2 主从切换&#xff1a; 切换成功后&#xff0c;原来的主库是红色的&#xff0c;需要在主库的配置页面点击“start replication ”&#xff0c;重新连接上新的主库。 1.3 主从故障&#xff0c;从库自动切换新…

Redis系列-2 Redis持久化机制

背景&#xff1a; 服务器重启后会丢失内存中的全部数据&#xff0c;内存数据库如果没有持久化机制&#xff0c;难以保证数据的可靠性&#xff0c;如Memcached。Redis提供了RDB(基于全量)和AOF(基于增量)两种持久化机制&#xff0c;一方面可以保证数据的可靠性&#xff0c;当服…

38-4 Web应用防火墙 - WAF的使用及规则

准备:38-3 Web应用防火墙 - 安装配置WAF-CSDN博客 WAF的使用 启动 Nginx /usr/local/nginx/sbin/nginx 为了测试未启动 ModSecurity 时的访问效果,我们可以模拟攻击。要查看当前虚拟机的 IP 地址,可以使用命令 ifconfig 浏览器中访问ip,如果要在真实机中访问就需要关闭…

Sqlserver批量迁移Job

因为切换物理机&#xff0c;需要把数据库的作业从A机器迁移到B机器&#xff0c;数据库整体备份还原就可以了&#xff0c;数据库上的作业不会跟着带过去&#xff0c;需要手动创建&#xff0c;作业数量太多&#xff0c;逐一创建太浪费时间&#xff0c;Microsoft SQL Server Manag…

M2M设备、消费设备、IoT设备

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 您提供的链接指向一篇关于GSMA SGP.32标准&#xff0c;即eSIM物联网(IoT)标准的文章。以下是文章的主要内容概述&#xff1a; ##…

JAVA基础之Swing窗体的几种布局

1、边框布局BorderLayout 特点&#xff1a;5个方位&#xff08;东&#xff08;East&#xff09;南&#xff08;north&#xff09;西(west)北(south)中(center)&#xff09; 是一种简单的布局策略。 使用时&#xff0c;应将其看成一个“组件”。 同样&#xff0c;首先应通…

工业项目组态用这个开源软件ScadaBR

软件介绍 ScadaBR 是一个开源软件&#xff0c;提供完整的 SCADA&#xff08;Supervisory Control and Data Acquisition&#xff0c;监控与数据采集&#xff09;系统的所有功能。SCADA 类型的软件自60年代末开始存在&#xff0c;并且在涉及机器、可编程逻辑控制器&#xff08;P…

【Linux入门】基础开发工具

本篇博客整理了Linux&#xff08;centOS版本&#xff09;中基础开发工具的用途和用法&#xff0c;旨在透过开发工具的使用&#xff0c;帮助读者更好地理解可执行程序的编写、编译、运行等。 目录 一、软件包管理器 yum 1.软件的下载与安装 2.Linux应用商店&#xff1a;yum …