Redis线程模型及性能优化概述

news2024/10/7 15:24:05

redis线程模型:

网络模块+命令处理
redis的性能
一个取决于物理内存,另一个是对于socket请求的处理速度。

4.0以前

单线程模式

请求流程:对于一个请求,线程会根据操作产生相应的事件(读,写事件),此时我们的程序对事件进行监听,监听到程序,交给文件事件分派器选择不同的处理器去处理,最后返回给socket
redis单线程处理流程

单线程能保证高性能

  • 内存存储:Redis使用内存作为数据存储介质,避免了磁盘I/O操作的瓶颈,这使得数据访问速度非常快。
  • 单线程模型:Redis通过单线程模型简化了内部逻辑,避免了多线程中频繁的上下文切换开销。
  • 事件驱动机制:由“事件”驱动运行的,事件状态对象、事件源、事件监听器。

产生问题:

  • 在当时redis单线程模型的处理速度很快,完全可以应对上亿的请求,但是redis在处理del bigkey时出现处理时间过长问题,这导致出现redis出现阻塞情况,性能变差,所以在4.0版本redis进行了部分改动。

4.0版本(伪多线程模式)

主线程(1个)+后台线程(3个)

解决策略:

后台线程(3)个:
close_file:关闭AOF,RDB过程中产生的大文件
aof_fsync:将追加至AOF的文件数据刷盘
lazy_free:惰性释放大对象(bigkey)
此时redis的思想是将专门的事交给专业的线程去做,对于耗时较长的操作都分别开启了对应的线程去进行处理。

惰性删除(lazy_free):只有当我们访问到该key时发现过期,才会对他进行删除
AOF:redis持久化存储,将所有的写操作存储到AOF文件当中,可以在关闭服务器之后还原之前的状态
RDB:对任意时刻的redis中所有的数据生成快照保存的硬盘中,可手动和自动,适合灾难性恢复。

6.0版本

在4.0版本处理了命令操作的问题,但是网络传输的发展,业务的扩展,请求数不断增长,但是对于redis来说,处理socket请求的线程只有一个(aeMain),想要提升处理速度,就需要开启多线程模式了。
多线程+后台线程
开启语句:io-thread-do-read yes

实现:采用epoll 机制实现 IO 多路复用

当客户端有数据发送至服务端时,Select 会监听到可读事件,数据读取完毕后提交到业务线程池中并发处理。
一般的请求中,耗时最长的一般是业务处理,所以用一个线程池(worker 线程池)来处理业务操作,在性能上的提升也是非常可观的。

在Reactor多线程模型中,业务逻辑通常指的是接受和处理客户端请求之后的操作,比如数据的查询、加工以及持久化等。

接收到socket请求后,我们采用eaMain()主线程对已经就绪的事件进行轮询,对于这一步,采用的是epoll机制,记录 「要监听的文件描述符」「已经就绪的文件描述符」,「已就绪的文件描述符」是由内核主动添加至就绪文件描述符集合中,我们从用户态调用 epoll_wait 就直接查询该集合是否有就绪 I/O 事件,这样下来,就减少了全遍历所有文件描述符的操作。

网络I/O多线程处理:Redis 6.0版本中,网络数据的读写这类耗时操作采用多线程执行,这样可以充分利用服务器的多核CPU资源。
命令执行仍为单线程:尽管网络I/O是多线程处理的,但Redis中执行用户命令的核心环节仍然是单线程的,这样避免了多线程环境下可能出现的数据竞态问题。

一位大佬的整个socket请求执行流程
对于已经就绪的事件,通过io多路复用程序将任务分发给不同的事件处理器进行处理,如果是读写请求,就将读写的响应通过 socket 响应给客户端。

总结:6.0版本,redis采用的是多线程+后台线程的方式,对于socket请求,我们采用eaMain主线程轮询socket操作产生的事件,事件产生被io多路复用处理后交给分别交给不同线程进行后续操作,比如查询等,除此之外还开启线程对处理速度较慢的事件单独开启后台线程。

使用:
  • 通常情况下,redis多线程是关闭的,4核以上推荐开启
  • 4核——2,3线程
  • 8核——6线程
  • 线程数不是越多越好,通常建议线程数小于核数

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

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

相关文章

idm线程怎么设置 idm线程数怎么上不去 idm免安装

IDM(Internet Download Manager)是一款流行的下载管理软件,IDM采用高级的多线程下载技术,可以将下载文件分成多个部分同时下载,从而提高下载速度,它因高效的下载速度和丰富的功能而受到用户的喜爱。接下来&…

探索Jellyfin:支持Android的自由开源的媒体服务器平台

探索Jellyfin:支持Android的自由开源的媒体服务器平台 I. 简介 A. 什么是Jellyfin? Jellyfin是一个自由开源的媒体服务器平台,旨在让用户能够自主管理和流式传输他们的媒体内容。与许多闭源的商业媒体服务器解决方案不同,Jelly…

LT2611UX四端口 LVDS转 HDMI2.0,带音频

描述LT2611UX 是一款面向机顶盒、DVD 应用的高性能 LVDS 至 HDMI2.0 转换器。LVDS输入可配置为单端口、双端口或四端口,具有1个高速时钟通道和3~4个高速数据通道,工作速率最高为1.2Gbps/通道,可支持高达19.2Gbps的总带宽。LT2611UX 支持灵活的…

ubuntu22 部署fastDFS单节点和集群,整合Spring Boot(刚部署成功)

ubuntu22 部署fastDFS单节点和集群 一、先准备1、所需依赖安装2、下载安装包 二、安装FastDFS单节点1、libfastcommon安装1.1、创建软连接 2、安装fastDFS2.1、fastDFS目录简单介绍2.2、创建软连接 3、配置和启动Tracker服务3.1、修改Tracker配置文件3.2、启动Tracker 4、配置和…

xLua热更新解决方案

图中灰色的无法实现热更新,而Lua代码可以打包成AB包,并上传到资源服务器, 当进入游戏检测是否有资源需要更新,需要则会从资源服务器下载。 学习目标 1.导入xLua框架 2.C#调用Lua 3.Lua调用C# 4.xLua热补丁 xLua框架导入和AB…

JAVA系列 小白入门参考资料 继承

目录 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 父类成员访问 4.1 子类中访问父类的成员变量 1. 子类和父类不存在同名成员变量 2. 子类和父类成员变量同名 4.2 子类中访问父类的成员方法 1. 成员方法名字不同 2. 成员方法名字相同 ​5. super关键字 …

使用Visual Studio在CMake项目中链接第三方库(OpenCV为例)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 为什么要链接第三方库? 提高效率:使用第三方库可以加速开发过程,因为你不需要从头开始编写所…

2024.4.25 LoadRunner 测试工具详解 —— Controller Analysis

目录 Controller 的使用 创建场景 Controller 快捷方式创建场景 VUG 针对写好脚本创建场景 场景设计 设计初始化 设计启动机制 设计性能测试脚本的执行时间 设计虚拟用户退出机制 场景运行 添加监控指标至图标格区域 Analysis 的使用 汇总报告 测试报表 吞吐量图 …

消灭AI“耗电巨兽”?暴雨服务器推出液冷节能降耗算力方案

在科技飞速发展的今天,人工智能已成为驱动未来的重要力量。随着AI及大模型技术的进一步普及和应用场景的拓宽,相关算力需求呈指数级增长,大规模的AI训练和推理过程均需消耗大量电力,如同一个巨大的电力黑洞,吞噬着海量…

线阵相机和面阵相机简介

线阵相机 线阵相机,顾名思义就是所探测的物体要在一个很长的界面上。线阵相机的传感器只有一行感光像素,所以线阵相机一般具有非常高的扫描频率和分辨率。 线阵相机特点 线阵相机使用的线扫描传感器通常只有一行感光单元(少数彩色线阵使用…

密文域可逆信息隐藏技术综述(上)

加密图像可逆信息隐藏是一种加密原始图像后,在密文图像中可逆地隐藏附加数据,并且在数据提取后,原始图像可以被无损重建的技术。RDH-EI的分类如图1所示。 按对图像的加密方法,现有RDH-EI算法可分为对称加密域和非对称(公钥)加密域…

新手向:HTML进阶

一&#xff0c;列表 列表分为有序列表&#xff0c;无序列表&#xff0c;定义列表三种 1.有序列表 ol 嵌套 li&#xff0c;ol 是有序列表&#xff0c;li 是列表条目 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

结构方程模型【SEM】:非线性、非正态、交互作用及分类变量分析

张老师&#xff08;研究员&#xff09;&#xff0c;长期从事R语言结构方程模型、群落生态学、保护生物学、景观生态学和生态模型方面的研究和教学工作&#xff0c;已发表了多篇论文&#xff0c;拥有丰富的科研及实践经验。 利用结构方程模型建模往往遇到很多‘特殊’情况&…

【论文阅读】Multi-Attention Based Ultra Lightweight Image Super-Resolution

Multi-Attention Based Ultra Lightweight Image Super-Resolution 论文地址摘要1 简介2 相关工作3 建议的方法3.1 特征融合组&#xff08;FFG&#xff09;3.2 多注意力块&#xff08;MAB&#xff09; 4 Experimental Setup4.1 消融研究4.2 Comparison with Existing Methods 5…

Rust HashMap

一、HashMap是什么&#xff0c;怎么用 1、HashMap是什么 HashMap 也是 Rust 标准库中提供的集合类型&#xff0c;但是又与动态数组不同&#xff0c;HashMap 中存储的是一一映射的 KV 键值对&#xff0c;并提供了平均时间复杂度为 O(1) 的查询方法。 2、HashMap怎么用 &…

基于Sping Boot集成的websocket实现聊天室

Spring Boot整合WebSocket实现聊天室 Spring Boot 提供了 Websocket 组件 spring-boot-starter-websocket&#xff0c;用来支持在 Spring Boot环境下对Websocket 的使用。 下面我们就以多人在线聊天室为例&#xff0c;演示 Spring Boot 是如何整合Websocket 实现服务端消息推…

Github Action Bot 开发教程

Github Action Bot 开发教程 在使用 Github 时&#xff0c;你可能在一些著名的开源项目&#xff0c;例如 Kubernetes&#xff0c;Istio 中看到如下的一些评论&#xff1a; /lgtm /retest /area bug /assign xxxx ...等等&#xff0c;诸如此类的一些功能性评论。在这些评论出现…

从0开始学习制作一个微信小程序 前端学习部分(7)数据控制操作,修改、判断等

系列文章目录 本系列会从前后端的全面角度讲述制作小程序&#xff0c;从零开始学小程序&#xff0c;跟着本系列就够了&#xff01; 前端学习篇 学习篇第一篇我们讲了编译器下载&#xff0c;项目、环境建立、文件说明与简单操作&#xff1a;第一篇链接 第二、三篇分析了几个重要…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(六)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 12 - 13节&#xff09; P12《11.ArkUI组件-循环控制》 forEach() 方法的使用方式&#xff1a; 在预览界面点击红框的按钮&#xf…

KKView远程控制2.0版本发布,TeamViewer面临巨大挑战

KKView远程控制2.0版本发布&#xff0c;TeamViewer面临巨大挑战 近日&#xff0c;备受瞩目的远程控制软件KKView发布了其全新2.0版本&#xff0c;KKView以其独特的创新性和用户友好的设计&#xff0c;为远程办公、远程培训等领域提供了更加高效、便捷的解决方案。 KKView远程…