redis原理篇(黑马程序员虎哥 )回忆笔记

原理,老师讲的真好。相见恨晚。
以下内容是按视频课程的章节安排,在我自己听完课之后,凭借记忆总结的。(可能存在疏漏不足,后期补全和修正,同时也在这个过程巩固我自己的对于这个组件相关原理的学习)

2、原理篇-Redis网络模型

2.1 用户空间和内核态空间

在这里插入图片描述
为什么分层:用户应用不能直接操纵硬件CPU 内存 网关等设备,要不然就乱套了。
怎么实现:中间需要一个中间层 被称为内核空间,然后用户应用放在用户空间,系统那些直接操作硬件设备的放在内核空间
流程:如上图,应用这边发起了一个读操作,调用系统调用(硬件)的接口,然后硬件驱动那边在获取数据,系统调用的那个接口,就一直等着这个数据回来(这里其实就造成了阻塞。)
还有怎么把数据拷回去呢,是放在内核空间的buffer(缓冲区)里面,然后再复制到用户空间的缓冲区。

从这里也可以看出,那里显得比较繁琐了吧。
时间的浪费 系统接口调用等着数据回来这个过程是阻塞的
空间时间的浪费 buffer在两个空间之间的拷贝

2.2.网络模型-阻塞IO

老师这里直接搬出 unix 网络编程 这本书,上面详尽的介绍了几种IO模型
在这里插入图片描述

就是上面这样的

2.3 网络模型-非阻塞IO

在这里插入图片描述
用户应用进程一直调用recvfrom来确认,
其实屁用没有。消耗的时间还是阻塞那么久,然后还让这边一直调用,然后CPU 蹭的一下上去了。
在这里插入图片描述
这里的进程就像这个收银员一样,然后那个任务就像是顾客点餐。阻塞IO就是他一直站那里点餐,然后收银员就等着。
非阻塞就是就是顾客一直站那里点餐,然后收银员 一直问:“选好了没有 选好了没有 选好了没有”。

2.4 网络模型-IO多路复用

继续上面的点餐,来说。能怎么优化呢。
IO多路复用,在假定只有一个服务员的情况下,怎么利用。
那不就是那个顾客点好了,让服务员过去记一下。这个是比较合理的

2.5 网络模型-IO多路复用-select方式

现在顾客点好餐了(任务完成了),呼叫服务员。
服务员那边有个小铃铛,知道有人点好餐了,他要过去,但是不知道是哪个人点的,他要一路上问过去。

然后在实现上面:
这个用的还是 long int 数组,存储的数量的数量是固定的,现在数据量多大呀,不够用
然后他这个知道任务完成了,还要通过遍历,太慢了
然后他还需要把 数组在内核态和用户态之间拷贝来拷贝去。

2.6 网络模型-IO多路复用模型-poll模式

和select一个德行
这个用的还是 long int 数组,存储的数量的数量是固定的,现在数据量多大呀,不够用 ,不过用的是链表了,可以无限了,
但还是要遍历,那无限长的链表,无限遍历,更慢了
然后他还需要把 链表在内核态和用户态之间拷贝来拷贝去。

2.7 网络模型-IO多路复用模型-epoll函数

最后也就是现在用的多的。
这个是那个任务好了(谁点餐了),直接把号发过去。合理

用的红黑树(用来存任务节点),和链表(用来返回那些已经完成的节点id)。之后把这个链表返回就行了
任务节点都有这个回调函数,就是任务完成的时候把自己的id写到链表里面、

实现上有三个操作 epoll_create(初始化,直接存在内核态) epoll_ctl(新增节点) epoll_wait(看看哪个完成了,插入链表)

他就是把 之前两个那种新增+监听的操作,拆成两个(epoll_ctl epoll_wait)了,

2.8、网络模型-epoll中的ET和LT

ET就是一直重复的发
LT就发一次

ET会惊群效应,可能就一个完成了,他就都发出去了
LT是发一次,就把那个链表断开了,节点删除了,但我们可以通过epoll_ctl再把这个链表建起来,达成ET模式的效果。

2.9 网络模型-基于epoll的服务器端流程

在这里插入图片描述

3.0 、网络模型-信号驱动

3.0.1 异步IO

3.0.2 对比

3.1 、网络模型-Redis是单线程的吗?为什么使用单线程

在内存命令上还是单线程的。
但整体而言,已经是多线程的形状了。

单线程快呀,内存多快呀,制约速度的永远是IO,网络IO 或者数据库IO
然后 多线程的弊端,额外的上下文切换,然后安全性还要加锁,又慢了

3.2 、Redis的单线程模型-Redis单线程和多线程网络模型变更

在这里插入图片描述
是在网络IO的时候引入多线程来加速的,也就是将请求数据写入那里,还有,将结果写入reply那里。

3、Redis通信协议-RESP协议

3.1、Redis通信协议-基于Socket自定义Redis的客户端

命令的解析(得解析的出来),还有命令回复得让服务器看得懂
所以有个这个协议

+单行字符串
-异常
$ 多行字符串
*数组
:数字
在这里插入图片描述

3.2、Redis内存回收-过期key处理

惰性删除
周期删除:slow fast

3.3 Redis内存回收-内存淘汰策略

8种 lru lfu random ttl allkeys
在这里插入图片描述

4、结束语

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

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

相关文章

Qt Debug模式下应用程序输出界面乱码【已解决】

Qt Debug模式下应用程序输出乱码 一、问题描述二、解决方法三、相关测试 一、问题描述 源码为utf-8编码. Qt Creator在Debug模式下运行程序,下方应用程序输出界面显示乱码. 但正常运行无乱码: 二、解决方法 尝试修改文件编码、执行编码无果… 可参考…

主打国产算力 广州市通用人工智能公共算力中心项目签约

4月9日,第十届广州国际投资年会期间,企商在线(北京)数据技术股份有限公司与广州市增城区政府就“广州市通用人工智能公共算力中心”项目进行签约。 该项目由广州市增城区人民政府发起,企商在线承建。项目拟建成中国最…

RK3568 android11 修改关机弹窗界面

需要修改关机弹窗界面&#xff0c;当前界面我已经按照客户需求去掉emergency 但是客户需要按其他区域可以实现返回&#xff0c;也就是点击黑色背景取消dialog 嗑代码发现黑色布局为&#xff1a; <node index"0" text"" resource-id"com.android.…

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

CSS基础:最详细 padding的 4 种用法解析

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 We…

编写一款2D CAD/CAM软件(十四)绘制工具栏

前面的文章已经封装了数个最基本的图元&#xff0c;但是视图的呈现是基于测试数据形成的。为了尽快完善软件交互的框架和能力&#xff0c;本文将增加工具栏。 资源文件 1.首先&#xff0c;创建按钮图标。使用绘图软件构建出工具栏按钮的图标&#xff0c;绘图软件多种多样&…

Vue之v-on事件修饰符的含义及使用

背景&#xff1a;Vue 拆封了一个组件&#xff0c;在组件里面会使用一个方法来改变父组件传过来的值&#xff0c; 但是在子组件里面操作父组件的数据变更&#xff0c;实在比较麻烦&#xff08;因为单向数据流&#xff09;&#xff0c; So 能不能直接在组件上面绑定事件方法呢&…

Nest 快速上手 —— (一)nest介绍与启动安装

参考资料&#xff1a;https://docs.nestjs.com/ 0.介绍 Nest (NestJS)是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript&#xff0c;构建并完全支持TypeScript(但仍然允许开发人员使用纯JavaScript编写代码)&#xff0c;并结合了OOP(面向对…

HCIP【路由过滤、路由引入实验】

目录 实验要求&#xff1a; 实验拓扑图&#xff1a; 实验思路&#xff1a; 实验步骤&#xff1a; 一、配IP地址 二、在相应的设备上配置RIP协议和OSPF协议 三、路由引入 四、路由过滤 五、配置静默接口 实验要求&#xff1a; 1、按照图示配置 IP 地址&#xff0c;R1&a…

网络靶场实战-Qiling Fuzz实例分析

背景 在上一小节中&#xff0c;介绍了qiling框架的背景和基础使用&#xff0c;并以相关的CTF和qilinglab实例进行练习加深对qiling框架的使用&#xff0c;后续并简单介绍了qiling fuzz的功能。 在这一小节&#xff0c;我们将对qiling fuzz iot设备进行测试以及以实例的方式对…

C++ 面向对象-封装

C 是一种多范式编程语言&#xff0c;它支持面向对象编程&#xff08;OOP&#xff09;范式。面向对象编程是一种程序设计思想&#xff0c;其中程序由对象组成&#xff0c;每个对象都是一个实例&#xff0c;具有数据和相关操作。在C中&#xff0c;实现面向对象编程主要通过类和对…

蓝桥杯2022年第十三届决赛真题-卡牌

贪心&#xff1a;循环m次&#xff0c;首先每次取卡片数最少的种类&#xff0c;判断它是否有补充机会&#xff0c;如果没有补充机会&#xff0c;根据短板效应&#xff0c;它的数量就是套牌数&#xff0c;结束。如果可以补充&#xff0c;就将它的数目增加1&#xff0c;m的数量减少…

ubuntu22.04搭建dns内网

近期&#xff0c;需要在无网络的ubuntu环境下搭建内部可用的dns内网&#xff0c;总共花费3个工作日晚上&#xff0c;总算成功搭建&#xff0c;做个记录&#xff0c;记录踩坑记录&#xff0c;同时方便以后翻阅。 安装软件包&#xff1a; 有网络环境下&#xff0c;比较简单&…

一个java项目中,如何使用sse协议,构造一个chatgpt的流式对话接口

前言 如何注册chatGPT&#xff0c;怎么和它交互&#xff0c;本文就不讲了&#xff1b;因为网上教程一大堆&#xff0c;而且你要使用的话&#xff0c;通常会再包一个算法服务&#xff0c;用来做一些数据训练和过滤处理之类的&#xff0c;业务服务基本不会直接与原生chatGPT交互。…

OpenCV-基于阴影勾勒的图纸清晰度增强算法

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 实现原理 大家在工作和学习中&#xff0c;无论是写报告还是论文&#xff0c;经常有截图的需求&#xff0c;比如图表、图纸等&…

使用 Docker 部署 TailChat 开源即时通讯平台

1&#xff09;介绍 TailChat 官网&#xff1a; https://tailchat.msgbyte.com/ 作者&#xff1a;https://www.moonrailgun.com/about/ GitHub &#xff1a; https://github.com/msgbyte/tailchat TailChat 是一款插件化易拓展的开源 IM 应用。可拓展架构赋予 Tailchat 无限可能…

【前端】vue的基础知识及开发指引

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Vue是什么二、学习 Vue.js 的基础知识三、熟悉 Vue.js 的生态系统四、掌握常用工具和库五、实践和项目开发六、 持续学习和跟进 前言 随着开发语言及人工智…

使用Docker搭建本地Nexus私有仓库

0-1开始Java语言编程之路 一、Ubuntu下Java语言环境搭建 二、Ubuntu下Docker环境安装 三、使用Docker搭建本地Nexus Maven私有仓库 四、Ubuntu下使用VisualStudioCode进行Java开发 你需要Nexus Java应用编译构建的一种主流方式就是通过Maven, Maven可以很方便的管理Java应用的…

全国832个贫困县名单及精准扶贫脱贫(摘帽名单)数据(2016-2020.11)

01、数据简介 自党的十八大以来&#xff0c;我国脱贫攻坚战取得了举世瞩目的伟大胜利。经过全党全国各族人民的共同努力&#xff0c;现行标准下9899万农村贫困人口全部脱贫&#xff0c;832个贫困县全部摘帽&#xff0c;12.8万个贫困村全部出列&#xff0c;区域性整体贫困得到解…

金融风控信用评分卡建模(Kaggle give me credit数据集)

1 数据预处理数据 数据来源于Kaggle的Give Me Some Credit&#xff0c;包括25万条个人财务情况的样本数据 1.1 导包读数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor import seaborn as …