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

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.rhkb.cn/news/316129.html

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

相关文章

【EI会议|稳定检索】2024年航空航天、空气动力学与自动化工程国际会议(ICAAAE 2024)

2024 International Conference on Aerospace, Aerodynamics, and Automation Engineering 一、大会信息 会议名称:2024年航空航天、空气动力学与自动化工程国际会议 会议简称:ICAAAE 2024 收录检索:提交Ei Compendex,CPCI,CNKI,Google Schol…

C语言 | Leetcode C语言题解之第50题Pow(x,n)

题目&#xff1a; 题解&#xff1a; double myPow(double x, int n){if(n 0 || x 1){return 1;}if(n < 0){return 1/(x*myPow(x,-(n1)));}if(n % 2 0){return myPow(x*x,n/2);}else{return x*myPow(x*x,(n - 1)/2);} }

前端发送请求,显示超时取消

前端发送请求&#xff0c;显示超时取消 问题说明&#xff1a;后台接口请求60s尚未完成&#xff0c;前端控制台显示取消&#xff08;canceled&#xff09; 原因 1、前端设置60s超时则取消 2、后台接口响应时间过长&#xff0c;过长的原因统计的数据量多&#xff08;实际也才17…

大象机器人开源六轴协作机械臂myCobot 320 手机摄影技术!

引言 有没有遇到过这样的情况&#xff1a;当你手持手机或相机准备拍摄视频时&#xff0c;心中已经构想了完美的画面&#xff0c;但却因为实际的限制无法捕捉到理想中的角度&#xff1f;这种情况可能会让人感到挫折。例如&#xff0c;如果想要从地面一只蚂蚁的视角拍摄&#xff…

UG NX二次开发(C++)-获取模型中所有的拉伸(Extrude)特征

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG 12中创建几个拉伸特征3、UFun中获取对象类型4、通过NXOpen过渡5.测试结果1、前言 在采用UG NX二次开发时,有时需要在模型中获取特定的对象,比如拉伸特征、关联特征等等。但是通过…

CSS实现各种优惠券效果

一、左半圆效果 <style style"text/css">.coupon {width: 240px;height: 100px;margin-top: 15px;background-color: #ff6347;-webkit-mask: radial-gradient(circle at left center, transparent 20px, red 20px); } </style><div class"coupon…

【函数式接口使用✈️✈️】配合策略模式实现文件处理的案例

目录 &#x1f378;前言 &#x1f37b;一、功能描述 &#x1f37a;二、面向对象设计模式 &#x1f379;三、策略模式 &#x1f366;四、策略 VS 面向对象 &#x1f368;章末 &#x1f378;前言 小伙伴们大家好&#xff0c;上周初步了解了下函数式接口&#xff0c;Consume…

认识Linux及一些基本

目录 linux简介&#xff1a; 1. 发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 企业应用现状 Linux在服务器领域的发展 Linux在桌面领域的发展 Linux在移动嵌入式领域的发展 Linux在云计算/大数据领域的发展 4. 发行版本 Debian Ubuntu 红帽企业级Linux Cent…

IIS中搭建.Net Core项目,步骤详解

一、准备服务器 1&#xff09;安装IIS 这个比较简单&#xff0c;百度一下就行 2&#xff09;安装 .NET Core 运行时 下载地址&#xff1a;下载 .NET(Linux、macOS 和 Windows) 因为我是本地开发&#xff0c;所以我下载的是SDK 安装成功之后显示如下&#xff1a; 检查是否安装…

边OTG边充电芯片LDR6500

随着科技的飞速发展&#xff0c;智能移动设备已成为我们生活中不可或缺的一部分。而在这些设备的连接与数据传输中&#xff0c;Type-C接口以其高效、便捷的特性逐渐占据了主导地位。OTG&#xff08;On-The-Go&#xff09;技术则进一步扩展了Type-C接口的功能&#xff0c;使得设…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置&#xff1a;2C&#xff0c;2G内存&#xff0c;50G存储 3、集群架构 从表格中&#xff0c;可以看出&#xff0c;Hadoop集群&#xff0c;主要有2部分&#xff0c;一个是HDFS服务&#xff0c;一个是YARN服务 …

win11 安装qt5.14.2 、qtcreator、vs编译器 。用最小安装进行 c++开发qt界面

系统 &#xff1a;win11 一、安装vs生成工具 &#xff0c;安装编译器 下载visualstudio tools 生成工具&#xff1a; 安装编译器 和 windows sdk&#xff1a; 安装debug 调试器&#xff1a; 二、Qt5.14.2下载 下载链接: Index of /archive/qt/5.14/5.14.2 安装qt 三、配置QT/…

(十三)Servlet教程——Servlet中Cookie的使用

1.什么是Cookie Cookie意为甜饼&#xff0c;最早由Netscape社区发展的一种机制。目前Cookie已经成为标准&#xff0c;所有的主流浏览器都支持Cookie。 由于HTTP是一种无状态的协议&#xff0c;服务器仅从网络连接上无法知道客户身份。于是就客户端颁发一个通行证&#xff0c;无…

神之浩劫2测试在哪下载 神之浩劫2客户端下载教程

在备受玩家喜爱的第三人称动作MOBA《神之浩劫》的辉煌基础上&#xff0c;其续作《神之浩劫2》宣布将于5月3日&#xff08;北京时间&#xff09;正式启动Alpha测试旅程&#xff0c;首度揭开神秘面纱&#xff0c;14位英勇角色静候被选中的探险者。此番&#xff0c;《神之浩劫2》的…

unity项目《样板间展示》开发:逻辑代码实现

unity项目《样板间展示》开发&#xff1a;逻辑代码实现 前言漫游逻辑实现UI功能逻辑实现静态光线问题解决结语 前言 这个项目的教程文章已经断更三个月之久&#xff0c;现向学习该项目dome的小伙伴们致歉。 断更原因嘛&#xff0c;就是实习工作&#xff0c;后续我也会发布相关的…

注意力机制(四)(多头注意力机制)

​&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习基础知识》 相关专栏&#xff1a; ⚽《机器学习基础知识》 &#x1f3d0;《机器学习项目实战》 &#x1f94e;《深度学习项目实…

virtualbox 网络设置实现主机和虚拟机互相访问

前言 一般来说&#xff0c;virtualbox 虚拟机的上网模式是 NAT。这样虚拟机可以上网并访问宿主机&#xff0c;但宿主机无法访问虚拟机&#xff0c;也无法 ping 通。下面介绍双网卡模式&#xff0c;实现虚拟机和宿主机能够互相访问 ping 通。 双网卡模式 进入虚拟机的网络设置…

串联超前及对应matlab实现

串联超前校正它的本质是利用相角超前的特性提高系统的相角裕度。传递函数为&#xff1a;下面将以一个实际的例子&#xff0c;使用matlab脚本&#xff0c;实现其校正后的相位裕度≥60。

微服架构基础设施环境平台搭建 -(六)Kubesphere 部署Redis服务 设置访问Redis密码

微服架构基础设施环境平台搭建 -&#xff08;六&#xff09;Kubesphere 部署Redis服务 & 设置访问Redis密码 微服架构基础设施环境平台搭建 系列文章 微服架构基础设施环境平台搭建 -&#xff08;一&#xff09;基础环境准备 微服架构基础设施环境平台搭建 -&#xff08;二…

使用CSS3 + Vue3 + js-tool-big-box工具,实现炫酷五一倒计时动效

时间过得真是飞速&#xff0c;很快又要到一年一度的五一劳动节啦&#xff0c;今年五天假&#xff0c;做好准备了吗&#xff1f;今天我们用CSS3 Vue3 一个前端工具库 js-tool-big-box来实现一个炫酷的五一倒计时动效吧。 目录 1 先制作一个CSS3样式 2 Vue3功能提前准备 3…