Redis(单/多)线程

一、 Redis  单线程  与  多线程  怎么说?

(1)重要的版本迭代

 redis4 之前仅支持 单线程, redis 4之后慢慢 支持多线程,  直到redis6/7后才稳定

(2)redis 的 工作线程 是 单线程的

       (命令) 工作线程 是指  处理Redis的 网络IO  +   键值对读写   的一个线程

        即redis 在处理 客户端请求时   ,所进行的  获取、 解析、 执行、 内容返回等 都是由一个顺序串行的主线程处理  

(3)对于  整个Redis 来说,是多线程的

        redis  的命令工作线程(单线程)+ 持久化RDB + AOF  + 异步删除 + 集群数据同步 (均有额外的线程执行)等等

        对于  整个Redis 来说,是多线程的

(4)redis3单线程时代  性能依旧快的  reason

1、基于内存操作: Redis 的所有数据都存在内存中 ,  因此所有的运算都是内存级别的, 所以他的性能比较高

2、数据结构简单: Redis 数据结构的 查找和操作 时间复杂度大部分为 O(1) , 因此性能比较高

3、多路复用+非阻塞I/O : Redis 使用 I/O 多路复用功能 来监听多个 socket 连接客户端

        可以使用一个线程连接来处理多个请求

        减少线程切换带来的开销

        避免 I/O 阻塞操作

4、避免上下文切换:单线程模型避免了不必要的  上下文切换  和  多线程竞争

        省去了多线程切换  的时间与性能上的  消耗

        而且  单线程不会导致  死锁问题

二、 为何 从单线程 过渡到 多线程

(1)单线程的痛点

redis3最经典的故障,BigKey删除问题

        程序会等待很久  才会释放,类似加了一个 synchronized 锁

        高并发场景下  会程序阻塞卡顿

如何解决?

        使用 惰性删除 可以有效避免  Redis卡顿

        Redis4  使用 unlink key  /  flushdb async / flushall async

三、 redis 6/7 的多线程特性 和 IO多路复用

(0)Redis的主要瓶颈

Redis的主要性能瓶颈:   系统内存大小  +  网络带宽(IO)    +  CPU(一般情况与CPU无关)

(1) IO 多路复用

 0. bg

由于网络硬件的性能提升, 底层网络硬件处理速度 >> 单个主线程网络请求速度

 so    ===> redis 6/7     采用多个IO 线程来处理 网络请求    

                 即  提高网络请求处理的并行度

1.处理流程

主线程 + IO线程  写作完成请求处理

四个阶段

2. 解释

 1.FD (文件描述符/句柄)

2. 解释

IO 多路复用 :

        一种同步的IO模型 ,实现一个线程监视多个文件句柄

        当某个句柄就绪,通知相应的应用程序  进行读写操作

        当没有时, 阻塞应用进程, 释放CPU资源

3. 概念

        I/O: 网络I/O, 数据在 内核态  与  用户态 之间的读写操作(OS层面)

        多路:多个客户端连接(连接指 套接字描述符,即socket or channel)

        复用:复用一个 or more 线程

        IO多路复用: 一个或一组线程 处理多个TCP 连接,使用单进程能够处理多个客户端连接

        total:  一个服务端进程可以  同时  处理多个套接字描述符

                   实现IO 多路复用的模型有3种 : 可分 select -> poll -> epoll 阶段描述

(2)Unix网络编程中的五种 IO 模型

1. Blocking IO - 阻塞IO

2. NoneBlocking IO - 非阻塞IO

3. IO multiplexing - IO多路复用

4. signal driven IO - 信号驱动IO

5. asynchronous IO - 异步IO

 (3) 设置多线程

在redis.conf中设置

四、面试题

1. redis到底是 单线程 还是 多线程?

  redis4 之前仅支持 单线程, redis之后慢慢 支持多线程,  直到redis6/7后才稳定

2.IO多路复用 是什么?

I/O: 网络I/O, 数据在 内核态  与  用户态 之间的读写操作(OS层面)

        多路:多个客户端连接(连接指 套接字描述符,即socket or channel)

        复用:复用一个 or more 线程

        IO多路复用: 一个或一组线程 处理多个TCP 连接,使用单进程能够处理多个客户端连接

        total:  一个服务端进程可以  同时  处理多个套接字描述符

3.redis为什么这么快?

        IO 多路复用 + epoll函数使用   (不仅仅是单线程命令  +  redis 安装到内存中)

4.Subtopic

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

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

相关文章

阿里云难题学习笔记

1、下列内存区段增长方是向低地址方向的有( )? A: 文本段 B: 数据段 C: 堆区 D: 栈区 解析: 在内存管理中,不同的内存区段增长方向是不同的。栈区(Stack)的增长方向是向低地址方向的&…

Nacos和Eureka有什么区别!!!

一致性模型: Eureka:采用的是 AP(Availability, Partition Tolerance)模型,即在面临网络分区或部分节点故障时优先保证系统的可用性,牺牲一定的数据一致性。Eureka 通过自我保护机制,允许在节点…

Python构建学生信息管理系统:构建RESTful API - 学生信息管理系统的后端逻辑

在之前的博客里,我们已经完成了项目初始化,在本篇博客中,我们将深入探讨如何使用Flask框架实现学生信息管理系统的后端逻辑,特别是通过RESTful API来实现学生信息的增删改查(CRUD)操作。 Flask RESTful AP…

go的内存分配机制

Go 语言的内存分配机制可以分为几个主要类别,每个类别都有其特定的行为和优化: 1. 栈(Stack)分配 局部变量:在函数内部定义的变量通常分配在栈上。大小限制:栈的大小有限,适用于生命周期短、大…

C系统编程:从零手搓一个shell

背景 这么久没更新就是在干这件事!!因为系统编程已经学的差不多了,所以想找几个项目练练手,之前就一直想写一个自己的shell!!现在终于有机会实现了。 首先说明一下我的操作系统:Arch linux 服务…

pandas 读取JSON字符串解析长整形丢失数据精度,读取值与实际值不一致

目录 背景: JSON字符串 解析代码 解决方案 背景: 在使用pandas read_json方法读取JSON存为Excel文件时,发现Excel中order_no的值与JSON字符串中的值不一致,开始怀疑是Excel保存精度问题,但是Excel输出实际为字符串…

【OceanBase系列】—— 常用 SQL

作者简介: 花名:绪宁,OceanBase 数据库解决方案架构师 对使用OB过程中常用的一些SQL进行了整理,对应的版本是 4.x。 集群信息 查看版本 show variables like version_comment; 查看集群ID和集群名 show parameters like %clust…

函数的查询

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在实际使用中经常会需要查询数据库中已有的函数或者某一个函数的内容,下面就介绍一下如何查询函数。 和存储过程类似,这也需要使用到数据字典user_s…

Spring - 4 ( 11000 字 Spring 入门级教程 )

一:Spring IoC&DI 在前⾯的章节中, 我们学习了 Spring Boot 和 Spring MVC 的开发, 可以完成⼀些基本功能的开发了, 但是什么是 Spring 呢? Spring, Spring Boot 和 SpringMVC 又有什么关系呢? 咱们还是带着问题去学习.我们先看什么是Spring 1.1 Spring 是什…

设计模式学习笔记 - 开源实战四(下):总结Spring中用到的11种设计模式

概述 上篇文章,讲解了 Spring 中支持扩展功能的两种设计模式:观察者模式和模板模式。这两种模式帮助我们创建扩展点,让框架的使用者在不修改源码的情况下,基于扩展点定制化框架功能。 实际上,Spring 框架中用到的设计…

vue项目中定位组件来源的查找思路

vue项目中定位组件来源的查找思路 先去【package.json】里面看看有没有看【a】开头或者【a-】开头的插件名 例如:如果我不知道【el-tree】,先去【package.json】里面找【el】或者【el-】开头的插件名,结果知道了【element-ui】这样就可以直接…

更新至2022年上市公司数字化转型数据合集(四份数据合集)

更新至2022年上市公司数字化转型数据合集(四份数据合集) 一、2000-2022年上市公司数字化转型数据(年报词频、文本统计) 二、2007-2022年上市公司数字化转型数据(年报和管理层讨论)(含原始数据…

微前端是如何实现作用域隔离的?

微前端是如何实现作用域隔离的? 一、前言 沙箱(Sandbox)是一种安全机制,目的是让程序运行在一个相对独立的隔离环境,使其不对外界的程序造成影响,保障系统的安全。作为开发人员,我们经常会同沙…

UE5 GAS开发P35,36,37,38,39 将药水修改为AbilitySystem效果

这几节课都是将药水修改成更方便使用的AbilitySystem效果的Actor,分别为增加血量,增加蓝量,暂时获得最大生命值上限 AuraEffectActor.h // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #…

设计模式- 策略模式(Strategy Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

前端vue+xgVIdeo集成rstp流播放

注意&#xff1a;rstp流需要对应的西瓜视频插件 项目&#xff1a; petition-manager 代码概览&#xff1a; 1. video-player 子 组件 <template><div id"video-player" class"video-player"></div> </template> <script&g…

Java面试之封装、继承和多态(简洁易懂版)

一、封装&#xff1a; 1.1、什么是封装&#xff1f; 封装是指将类的某些信息隐藏在类内部&#xff0c;不允许外部直接访问&#xff0c;而是通过类提供的方法来实现对隐藏信息的操作和访问。通过封装&#xff0c;可以提高代码的安全性和可靠性。在Java中&#xff0c;使用访问修…

介绍一个开源IOT组态项目

项目介绍 金合可视化平台是一款强大而操作简便的低代码平台&#xff0c;专为满足物联网领域的可视化开发需求而设计。通过该平台&#xff0c;用户可以利用拖拽配置的方式&#xff0c;轻松创建个性化的可视化大屏&#xff0c;无需熟练的编程技能&#xff0c;大幅提高了开发效率。…

图搜索的经典启发式算法A星(A*、A Star)算法详解

文章目录 1. 引言2. 广度优先搜索3. Dijkstra 算法4. 启发式优先搜索&#xff08;Heuristic&#xff09;4.1 贪心最佳优先搜索4.2 A*搜索 1. 引言 在许多场景中&#xff0c;我们常会遇到一类问题&#xff0c;即“找到一个位置到另一个位置的距离最短&#xff08;用时最少&…

抽象类和接口有什么区别?

1.抽象类&#xff08;abstract&#xff09;是事物的共有&#xff0c;主要是继承 接口&#xff08;interface&#xff09;是定义一组规范&#xff0c;主要是实现 2.抽象类是有构造方法 接口没有构造方法 3.抽象类有抽象方法&#xff0c;也有非抽象方法 接口自从jdk8之后&#xf…