Redis协议与异步方式

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.xdnf.cn/news/1410543.html

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

相关文章

使用jdbc方式操作ClickHouse

1、创建测试表&#xff0c;和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

【Vue】结合ElementUI实现简单数据请求和页面跳转功能

一、准备工作 1、创建一个Vue-cli程序 之前的博客有。各位看官姥爷&#xff0c;可以自查。 2、安装ElementUI 在创建Vue-cli程序的过程中&#xff0c;需要在控制台执行以下指令&#xff1a; #安装 element-ui npm i element-ui -S #安装 SASS 加载器 cnpm install sass-loa…

echarts 拖动markline,并计算中间区域的差值,标注红色虚线

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><!-- 引入 echarts.js --><script src"https://cdn.bootcdn.net/ajax/libs/echarts/4.8.0/echarts-en.common.js" rel"external nof…

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念&#xff08;了解&#xff09; 基本上 vi 可以分为三种状态&#xff0c;分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode)&#xff0c;各模式的功能区分如下: 命令行模式 command mode&#xff09;  控制屏幕光标的移动&a…

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

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

ssh远程访问windows系统下的jupyterlab

网上配置这一堆那一堆&#xff0c;特别乱&#xff0c;找了好久整理后发在这里 由于既想打游戏又想做深度学习&#xff0c;不舍得显卡性能白白消耗&#xff0c;这里尝试使用笔记本连接主机 OpenSSH 最初是为 Linux 系统开发的&#xff0c;现在也支持包括 Windows 和 macOS 在内…

《R语言与农业数据统计分析及建模》学习——数字图像处理

数字图像处理&#xff08;digital image processing&#xff09;又称计算机图像处理&#xff0c;它是指将图像信号转换成数字信号并利用数字图像处理计算机对其进行处理的过程。 常见的数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理。 R语言…

QT上位机的学习

后面又该找工作了&#xff0c;这块的内容也需要好好学习&#xff01; QT 篇 QT上位机串口编程-CSDN博客 (1)可以通过安装虚拟串口来模拟串口通信的情况 发现我之前安装过&#xff08;9.0): 可以生成虚拟串口&#xff0c;无需实际硬件串口就可以实现同一台电脑上串口模拟通信…

电路笔记 : 电容电阻大小表示(103、104、151、2R5、R15的含义)

电容电阻大小表示 电阻 数字索位标称法 数字索位标称法就是在电阻体上用三位数字来标明其阻值。它的第一位和第二位为有效数字&#xff0c;第三位表示在有效数字后面所加“0”的个数.这一位不会出现字母。如果阻值是小数.则用“R”表示“小数点”.并占用一位有效数字&#xf…

【51单片机普中板子74LS138+245+573可调时钟整点蜂鸣中级应用】2022-12-7

缘由用51单片机普中开发板实现数字时钟-嵌入式-CSDN问答 #include "reg52.h" //定义按键 sbit key0P3^0; sbit key1P3^1; sbit key2P3^2; sbit key3P3^3; //定义数码管位驱运位 sbit L1P2^2; sbit L2P2^3; sbit L3P2^4; sbit beepP2^5; unsigned char code ShuMaGua…

微调Mistral 7B以实现命名实体识别 (NER)

文章来源&#xff1a;fine-tuning-mistral-7b-for-named-entity-recognition-ner 2024 年 4 月 19 日 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;命名实体识别&#xff08;NER&#xff09;被认为是一项关键任务&#xff0c;应用范围广泛&#xff0c;包括信息…

tensorflow报错

参考 TensorFlow binary is optimized to use available CPU instructions in performance-critical operations._this tensorflow binary is optimized to use availab-CSDN博客 解决Python中cuBLAS插件无法注册问题_unable to register cudnn factory: attempting to re-CS…

SQL数据库

一.什么是数据库 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储。&#xff08;database 简称DB&#xff09; 数据库管理系统&#xff1a;管理数据库的大型软禁&#xff08;DataBase Management System 简称DBMS&#xff09; SQL&#xff1a;操作关系…

【MySQL 5.7安装时候 出现2503报错,解决方案】

MySQL5.7 安装遇 2503问题如何解决 1.能正常安装就点这里2.出现2503问题就看这2.1先看问题2.1.1在官网下载好安装包后&#xff0c;首先先确认安装包是否完整&#xff0c;排除安装包损坏的问题2.1.2 安装时候出现这个2503问题 2.2上解决方案2.2.1 打开任务管理器2.2.2 解决 1.能…

「C/C++ 01」volatile关键字 和 修改const修饰的变量

目录 一、修改const修饰的局部变量 二、无法修改const修饰的全局变量 三、volatile关键字 面试题】 一、修改const修饰的局部变量 可以通过指针和强转来修改const修饰的局部变量。 #include <iostream> using namespace std;int main(void) {const int a 1;int* pa (in…

hive表基本语法

hive表基本语法 青少年是一个美好而又是一去不可再得的时期 是将来一切光明和幸福的开端 目录 hive表基本语法 1.ROW FORMAT用法 2.LOCATION用法 3.EXTERNAL用法 &#xff08;外部表&#xff09; 4.STORED AS 用法&#xff1a;设置数据存储格式 5.TBLPROPERTIES 用法 6.P…

.位运算.

本题涉及到计算机组成与原理的相关知识 找了一篇相当不错的讲解&#xff0c;大家可以借鉴&#xff1a;位运算&#xff1a;按位与、按位或、按位异或、按位左移、按位右移-CSDN博客 给定一个长度为 n&#x1d45b; 的数列&#xff0c;请你求出数列中每个数的二进制表示中 11 的…

设计模式: 工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型…

网络架构建模:一个云案例研究-文章翻译

网络架构建模:一个云案例研究 摘要 互联网支持广泛服务的能力取决于网络架构以及未来网络所需的理论和实践创新。本文中的网络体系结构指的是计算机网络系统的结构及其物理组件、配置和通信协议之间的交互。多年来,人们对网络架构进行了各种各样的描述,其中有大量的表面图…

ICode国际青少年编程竞赛- Python-1级训练场-基本操作

ICode国际青少年编程竞赛- Python-1级训练场-基本操作 1、 Dev.step(3)2、 Dev.step(1)3、 Dev.step(7)4、 Dev.step(-1)5、 Dev.step(-5)6、 Dev.step(3) Dev.step(-8)7、 Dev.turnRight() Dev.step(1)8、 Dev.turnLeft() Dev.step(1)9、 Dev.step(4) Dev.tur…