Redis_Redission的入门案例、多主案例搭建、分布式锁进行加锁、解锁底层源码解析

目录

①. Redis为什么选择单线程?

②. 既然单线程这么好,为什么逐渐又加入了多线程特性?

③. redis6的多线程和IO多路复用入门篇

④. Redis6.0默认是否开启了多线程?

⑤. REDIS多线程引入总结


①. Redis为什么选择单线程?

①. 这种问法其实并不严谨,为啥这么说呢?

Redis的版本很多3.x、4.x、6.x,版本不同架构也是不同的,不限定版本问是否单线程也不太严谨

    1. 版本3.x ,最早版本,也就是大家口口相传的redis是单线程
    2. 版本4.x,严格意义来说也不是单线程,而是负责处理客户端请求的线程是单线程,但是开始加了点多线程的东西(异步删除)
    3. 最新版本的6.0.x后,告别了大家印象中的单线程,用一种全新的多线程来解决问题。—实锤

    ②. 有几个里程碑式的重要版本
    (5.0版本是直接升级到6.0版本,对于这个激进的升级,Redis之父antirez表现得很有信心和兴奋,所以第一时间发文来阐述6.0的一些重大功能"Redis 6.0.0 GA is out!")

     

    • ③. Redis3.x单线程时代但性能依旧很快的主要原因


      1.  

    1. 基于内存操作:Redis的所有数据都存在内存中,因此所有的运算都是内存级别的,所以他的性能比较高
    2. 数据结构简单:Redis的数据结构是专门设计的,而这些简单的数据结构的查找和操作的时间大部分复杂度都是 O(1),因此性能比较高
    3. 多路复用和非阻塞 I/O:Redis使用 I/O多路复用功能来监听多个 socket连接客户端,这样就可以使用一个线程连接来处理多个请求,减少线程切换带来的开销,同时也避免了I/O 阻塞操作
    4. 避免上下文切换:因为是单线程模型,因此就避免了不必要的上下文切换和多线程竞争,这就省去了多线程切换带来的时间和性能上的消耗,而且单线程不会导致死锁问题的发生

    • ④. 我们所说的Redis是单线程究竟何意?
    1. 主要是指Redis的网络IO和键值对读写是由一个线程来完成的,Redis在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。这也是Redis对外提供键值存储服务的主要流程
    2. 但Redis的其他功能,比如持久化、异步删除、集群数据同步等等,其实是由额外的线程执行的。Redis工作线程是单线程的,但是,整个Redis来说,是多线程的

    • ⑤. Redis 4.0之前一直采用单线程的主要原因有以下三个

         

      2.使用单线程模型是Redis的开发和维护更简单,因为单线程模型方便开发和调试;

      3.即使使用单线程模型也并发的处理多客户端的请求,主要使用的是多路复用和非阻塞 IO

      4.对于Redis系统来说,主要的性能瓶颈是内存或者网络带宽而并非CPU

      ②. 既然单线程这么好,为什么逐渐又加入了多线程特性?

      • ①. 单线程也有单线程的苦恼(举个例子)
      1. 正常情况下使用del指令可以很快的删除数据,而当被删除的key是一个非常大的对象时,例如时包含了成千上万个元素的hash集合时,那么del指令就会造成Redis主线程卡顿
      2. 这就是redis3.x单线程时代最经典的故障,大key删除的头疼问题
      3. 由于redis是单线程的,del bigKey…(等待很久这个线程才会释放,类似加了一个synchronized锁,你可以想象高并发下,程序堵成什么样子?)
      • ②. 如何解决:使用惰性删除可以有效的避免Redis卡顿的问题

      • ③. 案列:

      1. 比如当我(Redis)需要删除一个很大的数据时,因为是单线程同步操作,这就会导致Redis服务卡顿
      2. 于是在Redis 4.0中就新增了多线程的模块,当然此版本中的多线程主要是为了解决删除数据效率比较低的问题的
      3. 因为Redis是单个主线程处理,redis之父antirez一直强调"Lazy Redis is better Redis",而lazy free的本质就是把某些cost(主要时间复制度,占用主线程cpu时间片)较高删除操作,从redis主线程剥离让bio子线程来处理,极大地减少主线阻塞时间。从而减少删除导致性能和稳定性问题

      • ④. 在Redis 4.0就引入了多个线程来实现数据的异步惰性删除等功能,但是其处理读写请求的仍然只有一个线程,所以仍然算是狭义上的单线程。

      ③. redis6的多线程和IO多路复用入门篇

      • ①. 对于Redis主要的性能瓶颈是内存或者网络带宽而并非CPU
      • ②. 最后Redis的瓶颈可以初步定为:网络IO(redis6,真正多线程登场)

      • ③. Unix网络编程中的五种IO模型

      1. Blocking IO - 阻塞IO
      2. NoneBlocking IO - 非阻塞IO
      3. IO multiplexing - IO多路复用
      4. signal driven IO - 信号驱动IO
      5. asynchronous IO - 异步IO
      • ④. IO multiplexing - IO多路复用

         

         

        ④. Redis6.0默认是否开启了多线程?

        • ①. Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,对于小数据包,Redis服务器可以处理8W到10W的QPS,这也是Redis处理的极限了,对于80%的公司来说,单线程的Redis已经足够使用了

        • ②. 在Redis6.0中,多线程机制默认是关闭的,如果需要使用多线程功能,需要在redis.conf中完成两个设置

        ⑤. REDIS多线程引入总结



        1.  



        1.  

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

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

        相关文章

        集合的奇妙世界:Python集合的经典、避坑与实战

        集合的奇妙世界:Python集合的经典、避坑与实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南,旨在帮助读者从基础入门到项目实战,全面提升编程能力。文章结构由 5 个版块组成,内容层层递进&#x…

        2025年1月个人工作生活总结

        本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表,不需进入命令行模式。示例如下: sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…

        ARM嵌入式学习--第十一天(中断处理 , ADC)

        --中断的概念 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回被暂停的程序继续运行 --CPU处理事情的方式 -轮询方式 不断查询是否有事情需要处理&#xff0c…

        android Camera 的进化

        引言 Android 的camera 发展经历了3个阶段 : camera1 -》camera2 -》cameraX。 正文 Camera1 Camera1 的开发中,打开相机,设置参数的过程是同步的,就跟用户实际使用camera的操作步骤一样。但是如果有耗时情况发生时,会…

        JavaScript原型链与继承:优化与扩展的深度探索

        在 JavaScript 的世界里,万物皆对象,而每个对象都有一个与之关联的原型对象,这就构成了原型链的基础。原型链,简单来说,是一个由对象的原型相互连接形成的链式结构 。每个对象都有一个内部属性[[Prototype]]&#xff0…

        vue2项目(一)

        项目介绍 电商前台项目 技术架构:vuewebpackvuexvue-routeraxiosless.. 封装通用组件登录注册token购物车支付项目性能优化 一、项目初始化 使用vue create projrct_vue2在命令行窗口创建项目 1.1、脚手架目录介绍 ├── node_modules:放置项目的依赖 ├──…

        分层多维度应急管理系统的设计

        一、系统总体架构设计 1. 六层体系架构 #mermaid-svg-QOXtM1MnbrwUopPb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QOXtM1MnbrwUopPb .error-icon{fill:#552222;}#mermaid-svg-QOXtM1MnbrwUopPb .error-text{f…

        350.两个数组的交集 ②

        目录 题目过程解法 题目 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑…

        sublime_text的快捷键

        sublime_text的快捷键 向下复制, 复制光标所在整行并插入到下一行:通过 CtrlShiftD 实现快速复制当前行的功能。 可选多行, 不选则复制当前行 ctrl Shift D 删除当前行:通过 CtrlShiftK 实现快速删除当前行的功能。 可选多行, 不选则删当前行 ctrl S…

        [ACTF2020 新生赛]BackupFile1

        题目 翻译&#xff0c;尝试找出源文件&#xff01; 扫目录使用参数-e * python dirsearch.py -u http://0c3b21c0-d360-4baa-8b97-aa244f4c4825.node5.buuoj.cn:81/ -e * 最终扫描到一个文件名为&#xff1a;/index.php.bak的文件&#xff0c;把备份文件下载下来 源码 <?…

        OPENPPP2 —— VMUX_NET 多路复用原理剖析

        在阅读本文之前&#xff0c;必先了解以下几个概念&#xff1a; 1、MUX&#xff08;Multiplexer&#xff09;&#xff1a;合并多个信号到单一通道。 2、DEMUX&#xff08;Demultiplexer&#xff09;&#xff1a;从单一通道分离出多个信号。 3、单一通道&#xff0c;可汇聚多个…

        DeepSeek-R1大模型本地部署及简单测试

        目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世&#xff0c;这是一款免费、开源且隐私优…

        C# 数组和列表的基本知识及 LINQ 查询

        数组和列表的基本知识及 LINQ 查询 一、基本知识二、引用命名空间声明三、数组3.1、一维数组3.2、二维数组3.3、不规则数组 Jagged Array 四、列表 List4.1、一维列表4.2、二维列表 五、数组和列表使用 LINQ的操作和运算5.1、一维 LIST 删除所有含 double.NaN 的行5.2、一维 LI…

        C++计算给定序列在多次修改前后满足特定条件的极大匹配方案的大小

        给定长度为n的整数序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1​,a2​,...,an​和长度为n的01序列 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1​,b2​,...,bn​。 对于 1 ≤ i < j ≤ n 1\leq i<j\leq n 1≤i<j≤n&#xff0c;称二元组 ( i , j ) (i,j) (i,j)…

        强化学习笔记(3)——基于值函数的方法和策略梯度方法

        分为两大类方法&#xff1a; 基于值函数的方法&#xff08;Temporal Difference Methods, TD Methods&#xff09; 策略梯度方法&#xff08;Policy Gradient Methods&#xff09;。 二者不同之处&#xff1a; 通过值函数来间接表达隐式的策略&#xff0c;一个是直接迭代优化策…

        柱量最大值转向

        • 在MACD指标中&#xff0c;柱状线在0轴之上时用红色柱线表示&#xff0c;简称为“红柱”。 • 在上涨过程中&#xff0c;柱状线会在0轴之上不断向上发散&#xff0c;这是由于快线DIF带动慢线DEA向上运行&#xff0c;并且DIF不断远离DEA。 2. 上涨动能的变化&#xff1a;…

        Excel 技巧23 - 在Excel中用切片器做出查询效果(★★★)

        本文讲如何在Excel中用切片器做出查询效果。 目录 1&#xff0c;在Excel中用切片器做出查询效果 1-1&#xff0c;Excel 中的切片器是什么&#xff1f; 1-2&#xff0c;用切片器做出查询效果 1&#xff09;&#xff0c;点击任一表格内单元格&#xff0c;按下CtrlA&#xff0…

        Java 性能优化与新特性

        Java学习资料 Java学习资料 Java学习资料 一、引言 Java 作为一门广泛应用于企业级开发、移动应用、大数据等多个领域的编程语言&#xff0c;其性能和特性一直是开发者关注的重点。随着软件系统的规模和复杂度不断增加&#xff0c;对 Java 程序性能的要求也越来越高。同时&a…

        01.04、回文排序

        01.04、[简单] 回文排序 1、题目描述 给定一个字符串&#xff0c;编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。 2、解题思路 回文串的特点&#xff1a; 一个回文串在…

        leetcode——排序链表(java)

        给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&#xff1a; …