Redis-基础概念

目录

概念

Redis是什么

Redis 和 MySQL 的区别?

Redis单线程有什么极端场景的瓶颈

Redis为什么快?

为什么Redis是单线程?

Redis是单线程还是多线程

Redis为什么选择单线程做核心处理

Redis6.0之后引入了多线程,你知道为什么吗? 瓶颈是内存和I/O 不是 cpu 应对高并发场景

Redis6.0的多线程是默认开启的吗?

Redis6.0的多线程主要负责命令执行的哪一块 I/O的解包和回包,读写客户端socket的I/O

为什么用Redis作为MySQL的缓存?

Redis和Memcached(多线程、基于I/O多路复用、仅支持String,value大小限制在1MB,过期时间不超过30天、整存整取、有内存上限只有LRU、无法持久化、无法主从复制(集群))的联系和区别?

数据序列化与反序列化

如何理解Redis原子性操作原理?

说说 Redis 常用命令(补充)

sadd 命令的时间复杂度是多少?

单线程 Redis 的 QPS 是多少? 十万左右


概念

Redis是什么

Redis 和 MySQL 的区别?

  • Redis:数据存储在内存中的 NoSQL 数据库,读写性能非常好,是互联网技术领域中使用最广泛的缓存中间件。
  • MySQL:数据存储在硬盘中的关系型数据库,适用于需要事务支持和复杂查询的场景。

Redis单线程有什么极端场景的瓶颈

大key,复杂计算,阻塞操作

Redis为什么快?

  • 基于内存操作: Redis的绝大部分操作在内存里就可以实现,数据也存在内存中,与传统的磁盘文件操作相比减少了IO,提高了操作的速度。
  • 高效的数据结构: Redis有专门设计了STRING、LIST、HASH等高效的数据结构,依赖各种数据结构提升了读写的效率
  • 采用单线程: 单线程操作省去了上下文切换带来的开销和CPU的消耗,同时不存在资源竞争,避免了死锁现象的发生
  • I/O多路复用: 采用I/O多路复用机制,一个线程同时监听多个Socket,根据Socket上的事件来选择对应的事件处理器进行处理。
    • 基于 Linux 的 select/epoll 机制。该机制允许内核中同时存在多个监听套接字和已连接套接字,内核会一直监听这些套接字上的连接请求或者数据请求,一旦有请求到达,就会交给 Redis 处理,就实现了所谓的 Redis 单个线程处理多个 IO 读写的请求。

为什么Redis是单线程?

Redis单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程来完成的,这也是我们常说Redis是单线程的原因。

官方答案是:因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

---------------------------------------------------------------------------------------------------------------------------

后续采用多线程的模块和原因:

Redis在启动的时候,会启动后台线程(BIO):

  1. Redis的早期版本会启动2个后台线程,来处理关闭文件、AOF刷盘这两个任务;
  2. Redis的后续版本4.0,新增了一个新的后台线程,用来异步释放 Redis内存。执行unlink key / flushdb async / flushall async等命令,会把这些删除操作交给后台线程来执行。

之所以Redis为关闭文件、AOF刷盘、释放内存这些任务创建单独的线程来处理,是因为这些任务的操作都很耗时,把这些任务都放在主线程来处理会导致主线程阻塞,导致无法处理后续的请求。后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者不停轮询这个队列,拿出任务去执行对应的方法即可。

Redis是单线程还是多线程

Redis核心处理是单线程的,在6.0中使用了多线程进行I/O解包、回包。使用多线程进行删除数据等异步任务,4.0就引入了。

Redis为什么选择单线程做核心处理

我们从投入产出来看。首先如果引入多线程,主要是希望充分利用多核的性能,但Redis的定位,是内存 k-v存储,是做短平快的热点数据处理,一般来说执行会很快,执行本身不应该成为瓶颈,而瓶颈通常在n内存和网络I/O,处理逻辑上多线程并不会有太大收益。

同时,支持多线程的话,我们需要付出更大的复杂度、以及多线程上下文切换、同步机制的开销等成本。这样综合来看,成本高且收益不大,所以最终选择了不做,事实也证明,单线程的Redis也确实足够高效

Redis6.0之后引入了多线程,你知道为什么吗? 瓶颈是内存I/O 不是 cpu 应对高并发场景

Redis主要瓶颈是I/O而不是CPU,但随着互联网的高速发展,在部分高并发场景,单核CPU也不见得处理得过来了,所以针对核心处理流程中的解包、发包这两个CPU耗时操作,进行了多线程优化,充分发挥多核优势

Redis6.0的多线程是默认开启的吗?

默认是关闭的,如果想要开启需要用户在 redis.conf 配置文件中修改。

第一是为了兼容以前的,毕竟很多用户的认知中, Redis是单线程的。

第二可能也是认为多线程并不是必要的,在大多数场景不开启也是完全够用的。

Redis6.0的多线程主要负责命令执行的哪一块 I/O的解包和回包,读写客户端socket的I/O

原来核心流程中的I/O处理,包括解包和回包,也就是读写客户端socket的I/O,这两部分都消耗CPU时

间,多线程的引入主要也是为了解决单核CPU在大数据下还是不够用的问题。

为什么用Redis作为MySQL的缓存?

MySQL是数据库系统,对于数据的操作需要访问磁盘,而将数据放在Redis中,需要访问就可以直接从内存获取,避免磁盘I/O,提高操作的速度。使用Redis+MySQL结合的方式可以有效提高系统QPS。

系统的 QPS(Queries Per Second)是指系统每秒处理的请求数量,用于衡量系统的性能和吞吐量。

Redis和Memcached(多线程、基于I/O多路复用、仅支持String,value大小限制在1MB,过期时间不超过30天、整存整取、有内存上限只有LRU、无法持久化、无法主从复制(集群))的联系和区别?

共同点:

  • 都是内存数据库
  • 性能都非常高
  • 都有过期策略

区别:

线程模型:

  1. Memcached采用多线程模型,并且基于I/O多路复用技术,主线程接收到请求后分发给子线程处理,这样做好的好处是:当某个请求处理比较耗时,不会影响到其他请求的处理。
    1. 缺点是CPU的多线程切换存在性能损耗,同时,多线程在访问共享资源时要加锁,也会在一定程度上降低性能;
  1. Redis也采用I/O多路复用技术,但它处理请求采用是单线程模型,从接收请求到处理数据都在一个线程中完成。这意味着使用Redis一旦某个请求处理耗时比较长,那么整个Redis就会阻塞住,直到这个请求处理完成后返回,才能处理下一个请求,使用Redis时一定要避免复杂的耗时操作,
    1. 单线程的好处是,少了CPU的上下文切换损耗,没有了多线程访问资源的锁竞争,但缺点是无法利用CPU多核的性能

数据结构:

  1. Memcached支持的数据结构很单一,仅支持string类型的操作。并且对于value的大小限制必须在1MB以下,过期时间不能超过30天;
  2. Redis支持的数据结构非常丰富,除了常用的数据类型string、list、 hash、set、zset之外,还可以使用geo、hyperLogLog数据类型;
  3. 使用Memcached时,我们只能把数据序列化后写入到Memcached中。然后再从Memcached中读取数据,再反序列化为我们需要的格式,只能”整存整取";
  4. Redis提供的数据结构提升了操作的便利性。

淘汰策略:

  1. Memcached必须设置整个实例的内存上限,数据达到上限后触发LRU淘汰机制优先淘汰不常用使用的数据。它的数据淘汰机制存在一些问题: 刚写入的数据可能会被优先淘汰掉,这个问题主要是它本身内存管理设计机制导致的;
  2. Redis没有限制必须设置内存上限,如果内存足够使用,Redis可以使用足够大的内存,同时Redis提供了多种内存淘汰策略。

持久化:

  1. Memcached不支持数据的持久化,如果Memcached服务宕机,那么这个节点的数据将全部丢失。Redis支持AOF和RDB两种持久化方式。

集群:

  1. Memcached没有主从复制架构,只能单节点部署,如果节点宕机,那么该节点数据全部丢失,业务需要对这种情况做兼容处理,当某个节点不可用时,把数据写入到其他节点以降低对业务的影响;
  2. Redis拥有主从复制架构,从节点可以实时同步主节点的数据,提高整个Redis服务的可用性。

数据序列化与反序列化

数据序列化是将数据对象转换为可以在网络传输或存储中使用的字节流的过程。序列化后的数据可以被传输到远程系统或存储到磁盘等介质中,并在需要时进行反序列化还原为原始的数据对象。

数据序列化的主要目的是实现数据的持久化、跨平台通信和远程过程调用(RPC)。在不同的编程语言和系统之间,使用统一的序列化格式可以方便地传递数据,并保持数据的一致性和完整性

常见的数据序列化格式包括以下几种:

  1. JSON(JavaScript Object Notation):JSON 是一种轻量级的数据交换格式,易于阅读和编写。它使用键值对的方式表示数据,并支持多种数据类型,如字符串、数字、布尔值、数组和对象。JSON 在 Web 应用程序中广泛使用,且多数编程语言都提供了 JSON 的序列化和反序列化库。
  2. XML(eXtensible Markup Language):XML 是一种标记语言,用于描述和传输结构化数据。它使用标签和属性来定义数据的结构,并支持层次关系。XML 通常用于支持跨平台的数据交换,并且具有一定的扩展性和灵活性。
  3. Protocol Buffers:Protocol Buffers(简称 Protobuf)是一种由 Google 开发的二进制序列化格式。它使用结构化的消息定义来描述数据的结构,并生成相应的代码用于序列化和反序列化。Protobuf 具有高效的编码和解码性能,适用于高性能和分布式系统。
  4. MessagePack:MessagePack 是一种轻量级的二进制序列化格式,具有高性能和紧凑的数据表示。它支持多种数据类型,并提供了多个编程语言的实现。MessagePack 在数据传输和存储方面具有较低的开销和较高的效率。
  5. BSON(Binary JSON):BSON 是一种二进制形式的 JSON 扩展,用于存储和传输 MongoDB 数据库中的文档。BSON 支持更多的数据类型和功能,如日期、二进制数据和引用。

如何理解Redis原子性操作原理?

  • API: Redis提供的API都是单线程串行处理的。
  • 网络模型:采用单线程的epoll的网络模型,用来处理多个Socket请求。 IO多路复用
  • 请求处理: Redis会fork子进程来出来类似于RDB和AOF的操作,不影响主进程工作。

epoll 是 Linux 内核提供的一种事件驱动 I/O 接口,用于高效地处理大量的文件描述符(sockets、文件等)的并发事件。

socket 请求是一种基于网络的通信方式,用于在客户端和服务器之间进行数据传输和交互。通过 Socket 请求,客户端可以向服务器发送请求,并接收服务器的响应。

说说 Redis 常用命令(补充)

①、操作字符串的命令有:

  • SET key value:设置键 key 的值为 value。
  • GET key:获取键 key 的值。
  • DEL key:删除键 key。
  • INCR key:将键 key 存储的数值增一。
  • DECR key:将键 key 存储的数值减一。

②、操作列表的命令有:

  • LPUSH key value:将一个值插入到列表 key 的头部。
  • RPUSH key value:将一个值插入到列表 key 的尾部。
  • LPOP key:移除并返回列表 key 的头元素。
  • RPOP key:移除并返回列表 key 的尾元素。
  • LRANGE key start stop:获取列表 key 中指定范围内的元素。

③、操作集合的命令有:

  • SADD key member:向集合 key 添加一个元素。
  • SREM key member:从集合 key 中移除一个元素。
  • SMEMBERS key:返回集合 key 中的所有元素。

④、操作有序集合的命令有:

  • ZADD key score member:向有序集合 key 添加一个成员,或更新其分数。
  • ZRANGE key start stop [WITHSCORES]:按照索引区间返回有序集合 key 中的成员,可选 WITHSCORES 参数返回分数。
  • ZREVRANGE key start stop [WITHSCORES]:返回有序集合 key 中,指定区间内的成员,按分数递减。
  • ZREM key member:移除有序集合 key 中的一个或多个成员。

⑤、操作哈希的命令有:

  • HSET key field value:向键为 key 的哈希表中设置字段 field 的值为 value。
  • HGET key field:获取键为 key 的哈希表中字段 field 的值。
  • HGETALL key:获取键为 key 的哈希表中所有的字段和值。
  • HDEL key field:删除键为 key 的哈希表中的一个或多个字段。
sadd 命令的时间复杂度是多少?

向指定 Set 中添加 1 个或多个 member,如果指定 Set 不存在,会自动创建一个。时间复杂度 O(N) ,N 为添加的 member 个数。

单线程 Redis 的 QPS 是多少? 十万左右

Redis 的 QPS(Queries Per Second,每秒查询率)受多种因素影响,包括硬件配置(如 CPU、内存、网络带宽)、数据模型、命令类型、网络延迟等。

根据官方的基准测试,一个普通服务器的 Redis 实例通常可以达到每秒数万到几十万的 QPS。

可以通过 redis-benchmark 命令进行基准测试:

redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000
  • -h:指定 Redis 服务器的地址,默认是 127.0.0.1。
  • -p:指定 Redis 服务器的端口,默认是 6379。
  • -c:并发连接数,即同时有多少个客户端在进行测试。
  • -n:请求总数,即测试过程中总共要执行多少个请求。

我本机是一台 macOS,4 GHz 四核 Intel Core i7,32 GB 1867 MHz DDR3,测试结果如下:

可以看得出,每秒能处理超过 10 万次请求。

自己整理,借鉴很多博主 感谢他们

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客,如果一切顺利,会不定期更新。 如果感觉不妥,可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

用switch实现多分支选择结构

一 例子引入 #include<stdio.h> int main&#xff08;) {char grade&#xff1b;scanf("%c"&#xff0c;&grade);printf("Your score:");switch (grade){case A: printf("85~100\n"); break;case B: printf("70~84\n");br…

深度学习落地实战:识别火车票信息

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

嵌入式人工智能(9-基于树莓派4B的PWM-LED呼吸灯)

1、PWM简介 (1)、什么是PWM 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制&#xff0c;是在具有惯性的系统中利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在从测量、通信到功率控制…

在 Linux 系统中安装MySQL 8.x(Ubuntu和CentOS)

文章目录 0. 前言1. 查看 Linux 的发行版本2. 在 Ubuntu 中安装MySQL 8.x2.1 更新包索引2.1.1 更改 Ubuntu 的镜像源2.1.2 更新软件包、升级软件包&#xff08;耗时可能较长&#xff09;2.1.3 可能遇到的问题 2.2 安装MySQL2.3 安全配置2.3.1 密码安全级别2.3.2 删除匿名用户2.…

华为HCIP Datacom H12-821 卷41

1.多选题 以下关于BGP Atomic_Aggregate和Aggregator的描述&#xff0c;正确的是哪些项? A、Aggregator属性属于可选过渡属性 B、Atomic_Aggregate属于公认任意属性 C、收到携带Atomic_Aggregate属性的路由表示这条路由不能再度明细化 D、 Agregator表示某条路由可能出现…

各类专业技术的pdf电子书

从业多年&#xff0c;收集了海量的pdf电子书籍&#xff0c;感兴趣的私聊。

设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点&#xff1a;①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…

【node-RED 4.0.2】连接 Oracle 数据库踩坑解决,使用模组:node-red-contrib-agur-connector

关于 Oracle Oracle 就好像一张吸满水的面巾纸&#xff0c;你稍一用力它就烂了。 PS&#xff1a;我更新了更好的模组的教程&#xff0c;这篇已经是旧款的教程&#xff0c;但是它仍旧包含了必要的配置环境变量等操作。 最新的模组教程&#xff1a;node-red-contrib-agur-connec…

数据湖仓一体(一) 编译hudi

目录 一、大数据组件版本信息 二、数据湖仓架构 三、数据湖仓组件部署规划 四、编译hudi 一、大数据组件版本信息 hudi-0.14.1zookeeper-3.5.7seatunnel-2.3.4kafka_2.12-3.5.2hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1flink-1.17.2apache-dolphinscheduler-3.1.9…

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…

基于视觉工具箱和背景差法的行人检测,行走轨迹跟踪,人员行走习惯统计matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 在三维图中&#xff0c;幅度越大&#xff0c;则表示人员更习惯的行走路线。 2.算法运行软件版本 matlab2022a 3.部分核…

css基础(1)

CSS CCS Syntax CSS 规则由选择器和声明块组成。 CSS选择器 CSS选择器用于查找想要设置样式的HTML元素 一般选择器分为五类 Simple selectors (select elements based on name, id, class) 简单选择器&#xff08;根据名称、id、类选择元素&#xff09; //页面上的所有 …

【经验分享】关于静态分析工具排查 Bug 的方法

文章目录 编译器的静态分析cppcheck安装 cppcheck运行 cppcheck 程序员的日常工作&#xff0c;不是摸鱼扯皮&#xff0c;就是在写 Bug。虽然这是一个梗&#xff0c;但也可以看出&#xff0c;程序员的日常一定绕不开 Bug。而花更少的时间修复软件中的 Bug&#xff0c;且不引入新…

Bug:时间字段显示有问题

Bug&#xff1a;时间字段显示有问题 文章目录 Bug&#xff1a;时间字段显示有问题1、问题2、解决方法一&#xff1a;添加注解3、解决方法二&#xff1a;消息转换器自定义对象映射器配置消息转换器 1、问题 ​ 在后端传输时间给前端的时候&#xff0c;发现前端的时间显示有问题…

汽车开发阶段(OTS/VFF/PVS/OS/SOP)

OTS&#xff1a;即英语中的Off Tooling Sample&#xff0c;通常被称为工装样件。它指的是通过配套设备、工装夹具以及模具制造出来的样品&#xff0c;但并不强调生产的时间效率&#xff0c;主要用于验证产品的设计能力。 VFF&#xff1a;在德语中表示为Vorserien Freigabefahr…

太速科技-FMC207-基于FMC 两路QSFP+光纤收发子卡

FMC207-基于FMC 两路QSFP光纤收发子卡 一、板卡概述 本卡是一个FPGA夹层卡&#xff08;FMC&#xff09;模块&#xff0c;可提供高达2个QSFP / QSFP 模块接口&#xff0c;直接插入千兆位级收发器&#xff08;MGT&#xff09;的赛灵思FPGA。支持利用Spartan-6、Virtex-6、Kin…

eNsp公司管理的网络NAT策略搭建

实验拓扑图 实验需求&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 8&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 9&#xff0c;多出口环境基于带…

JavaWeb(四:Ajax与Json)

一、Ajax 1.定义 Ajax&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff1a;异步的 JavaScript 和 XML AJAX 不是新的编程语言&#xff0c;指的是⼀种交互方式&#xff1a;异步加载。 客户端和服务器的数据交互更新在局部页面的技术&#xff0c;不需要刷新…

VUE:跨域配置代理服务器

//在vite.config。js中&#xff0c;同插件配置同级进行配置server:{proxy:{"/myrequest":{//代理域名&#xff0c;可自行修改target:"https://m.wzj.com/",//访问服务器的目标域名changeOrigin:true,//允许跨域configure:(proxy,options) > {proxy.on(&…