Redis-基础概念

news2024/9/24 23:29:31

目录

概念

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.coloradmin.cn/o/1931955.html

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

相关文章

SAP PP学习笔记28 - 生产订单的收货及品质管理

上一章讲了生产订单的很多概念,比如确认(报工)以及报工的各种形式,反冲,自动入库等。 SAP PP学习笔记27 - Confirmation(报工/确认)(CO11,CO11N,CO15,CO12),…

IOS系统有什么好用的藏语翻译软件推荐吗?

藏语翻译通是我使用过的比较好用实用的藏语翻译软件。 藏语翻译通是一款专为藏语和汉语互译设计的智能翻译软件,它利用最新的人工智能技术,为用户提供高效、准确的翻译服务。软件界面简洁直观,易于操作,无论是藏语学习者、研究者…

C++中的变量的同名隐藏

同名隐藏是C中的一个概念,在一个类的继承关系中,子类中定义了一个与父类中同名的成员函数。当这种情况发生时,子类中的函数会隐藏掉所有父类中同名的函数,这意味着在子类中调用这个函数时,会优先调用子类中定义的版本&…

图书馆定位导航:RFID、VR与AR技术在图书馆中的应用

图书馆作为知识的宝库,承载着无数求知者的梦想与期待,随着馆藏书籍数量的激增与图书馆布局的日益复杂,读者在寻找目标书籍往往有许多困难。传统的索引号查询方式虽能提供书籍的基本信息,但在寻找过程中,因不熟悉图书馆…

智慧博物馆的“眼睛”:视频智能监控技术守护文物安全与智能化管理

近日,位于四川德阳的三星堆博物馆迎来了参观热潮。据新闻报道,三星堆博物馆的日均参观量达1.5万人次。随着暑假旅游高峰期的到来,博物馆作为重要的文化场所,也迎来了大量游客。博物馆作为文化和历史的重要载体,其安全保…

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA) CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…

网络开局 与 Underlay网络自动化

由于出口和核心设备 部署在核心机房,地理位置集中,业务复杂,开局通常需要网络工程师进站调测。 因此核心层及核心以上的设备(包含核心层设备,旁挂独立AC设备和出口设备)推荐采用WEB网管开局方式或命令行开局方式。 核心以下的设备(包含汇聚层设备、接入层设备和AP)由于数量众…

【程序大侠传】服务发布引发mq消息重复消费

前序 在编程武侠世界中,有一个门派“天机楼”,连接并协调各大门派之间的关系,确保整个江湖的运作流畅无阻。天机楼住要的业务范围主要如下: 信息传递的信使: 天机楼就像是江湖中的飞鸽传书,确保各门派之间…

学生管理系统(C语言)(Easy-x)

课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : XXXXX XXXXX 学 生 姓 名 : XXX 学 号 : 231040700302 任 课 教 师 &a…

电瓶车检测AI算法:视频智能分析技术助力电瓶车规范与安全管理

随着电瓶车(电动自行车)的普及,其在城市交通中扮演着越来越重要的角色。然而,电瓶车的管理、安全监控以及维护等方面也面临着诸多挑战。近年来,人工智能(AI)技术的发展为解决这些问题提供了新的…

Ubuntu安装virtualbox(win10)

virtualbox下载安装 1、下载virtualbox 下载路径:Linux_Downloads – Oracle VM VirtualBox 根据自己的Ubuntu版本选择对应的安装包下载 2、安装virtualbox 到下载路径(一般为~/Download)打开终端输入命令 sudo dpkg -i xxx.deb 继续执…

求解答word图标变白

把WPS卸载了之后就变成白色了,然后在注册表中把word的地址改成office word的地址之后图标变成这样了,怎么办

【漏洞复现】Rejetto HTTP文件服务器——远程命令执行(CVE-2024-23692)

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 Rejetto HTTP文件服务器是一个轻量级的HTTP服务器软件&#xff…

电源芯片MPQ3431A

一、芯片介绍 MPQ3431A是一款具有宽输入范围的固定频率为450kHz的高度集成的升压转换器,其输入电压低至2.7V,采用恒定关断时间(COT)的控制拓扑,可提供快速的瞬态响应。芯片支持通过MODE管脚配置PSM(pulse-…

redis基本类型和订阅

redis-cli -h <host> -p <port> -a <password> 其中&#xff0c;< host>是Redis服务器的主机名或IP地址&#xff0c;< port>是Redis服务器的端口号&#xff0c;< password>是Redis服务器的密码&#xff08;如果有的话&#xff09;。 set …

FPGA CFGBVS 管脚接法

说明 新设计了1个KU040 FPGA板子&#xff0c;回来之后接上JTAG FPGA不识别。做如下检查&#xff1a; 1、电源测试点均正常&#xff1b; 2、查看贴片是否有漏焊&#xff0c;检查无异常&#xff0c;设计上NC的才NC&#xff1b; 3、反复检查JTAG接线是否异常&#xff0c;贴片是…

Large Language Model系列之一:语言模型与表征学习(Language Models and Representation Learning)

语言模型与表征学习&#xff08;Language Models and Representation Learning&#xff09; 1 语言模型 N-Gram模型 from collections import defaultdictsentences [The swift fox jumps over the lazy dog.,The swift river flows under the ancient bridge.,The swift br…

C语言 ——— 编写代码,判断 整型数组 是否 有序

目录 题目要求 代码实现 题目要求 判断 整型数组 是否有序 如果 整型数组 有序输出 sorted&#xff1b;否则输出 unsorted 代码实现 #include<stdio.h> int main() {int arr[10] { 0 };int sz sizeof(arr) / sizeof(arr[0]);//输入for (int i 0; i < sz; i){s…

大数据基础:Doris重点架构原理

文章目录 Doris重点架构原理 一、Apache Doris介绍 二、Apache Doris使用场景 三、Apache Doris架构原理 四、Apache Doris 特点 Doris重点架构原理 一、Apache Doris介绍 基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff…

YOLOV5的输出[1,25200,85]如何理解和解析

1、25200代表着检测框的数量&#xff0c;比如我们取出第一个检测框a&#xff0c;也就是[1,1&#xff0c;85]&#xff0c;取出来之后我们解析85&#xff0c;前五个为box的中点坐标、长宽值以及置信&#xff0c;后面80我们取Max&#xff08;80个类别&#xff09;中最大值&#xf…