Redis高性能原理
redis大家都知道拥有很高的性能,每秒可以支持上万个请求,这里探讨下它高性能的原理。单线程架构和io多路复用技术。
一,单线程架构
单线程架构指的是命令执行核心线程是单线程的,数据持久化、同步、异步删除是其他线程在跑的。redis收到客户端的命令是无序的,谁先来谁就先存起来,存到队列中。然后走队列依次取出命令执行。所以并不会产生并发问题。
那么为什么单线程反而很快呢?
1,纯内存访问肯定快。
2,不涉及多线程切换带来的额外开销。
二,io多路复用
redis实现了reactor模型,利用linux的epoll机制实现了io多路复用的技术。
那为什么io多路复用技术就性能高呢?
因为io多路复用可以在一个监控线程里监听很多连接,没有io操作时只需要挂起监控线程,而不用挂起工作线程。只要有io操作事件到达时,就会唤起监听线程进行处理,而不用轮训判断是否有数据到达。我们试想下并发的连接可能成千上万,如果每个都开个线程处理系统肯定承受不了。就算用线程池,那么线程在阻塞等待时也什么都干不了,而且开几百个线程频繁切换性能也有问题。
reactor模型有三个事件:连接事件,读事件,写事件。三个角色:reactor(反应者)、acceptor(接收者)、处理者。
reactor监听事件,如果是连接事件则将事件分给acceptor。acceptor建立连接后创建处理器用于后续读写处理。如果是读写事件时则直接分给handler处理。

常见的慢操作
既然它是单线程架构,那么线程一旦阻塞就会导致后续操作变慢。
1,操作大对象的命令肯定慢。应该将数据拆分到多个key中。
2,keys、sort命令会进行较大计算,会导致阻塞。
3,一些批量操作的命令应该谨慎使用,会导致去多节点取数据,也比较耗时。
相关文章:
Redis高性能原理
redis大家都知道拥有很高的性能,每秒可以支持上万个请求,这里探讨下它高性能的原理。单线程架构和io多路复用技术。 一,单线程架构 单线程架构指的是命令执行核心线程是单线程的,数据持久化、同步、异步删除是其他线程在跑的。re…...
MSS与cwnd的关系,rwnd又是什么?
慢启动算法是指数递增的 这种指数增长的方式是慢启动算法的一个核心特点,它确保了TCP连接在开始传输数据时能够快速地探测网络的带宽容量,而又不至于过于激进导致网络拥塞。具体来说: 初始阶段:当TCP连接刚建立时,拥…...
解决两个MySQL5.7报错
目录 1.启动不了MySQL,报错缺少MSVCR120.dll去官网下载vcredist_x64.exe运行安装进入管理员CMD 2.本地计算机 上的 mysql 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止,Fatal error: Can‘t open and lock privilege tables: Table ‘…...
[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道
前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…...
机器人初识 —— 电机传动系统
一、背景 波士顿动力公司开发的机器人,其电机传动系统是其高性能和动态运动能力的核心部分。电机传动系统通常包括以下几个关键组件: 1. **电动马达**:波士顿动力的机器人采用了先进的电动马达作为主要的动力源,如伺服电机或步进…...
安卓游戏开发之音频技术优劣分析
一、引言 在安卓游戏开发中,音频处理技术扮演着至关重要的角色,它不仅能够增强游戏的沉浸感和玩家体验,还能通过声音效果传达关键的游戏信息。以下将对几种常见的安卓游戏音频处理技术进行优劣分析,并结合应用场景来阐述其特点。 …...
在C语言中,设置Linux系统时间
C 语言中使用 mktime 函数和 stime 函数来处理时间。 处理之前,需要先获取当前的时间戳。并使用当前的时间戳生成struct tm,struct tm是C语言中用于表示日期和时间的结构体,通常用于在程序中操作和处理日期时间信息。它包含了以下成员变量&a…...
golang k8s包管理工具
k8s包管理工具Helm Helm简介Helm基础概念Helm安装Helm命令Helm Chart(图表)Chart语法Chart变量替换Chart模板控制结构Chart模板函数Chart迭代和范围Helm Values(值)Helm Release(发布)Helm Repository&…...
数字信号处理:傅里叶分析
本文主要参考视频如下: 数字信号处理9-1_线性时不变系统对复指数信号的响应_哔哩哔哩_bilibili 傅里叶分析的主要研究内容如下所示: 注意,计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换; 前四种都是理论上的变换方式&…...
pat 甲级 1051 Pop Sequence
思想:如果要弹出一个数,那么说明比它小的数字已经进栈了,所以要在一个数num输入之后把比它小的数都输入到栈中,直到栈满或者valnum时结束入栈操作。如果valnum,将这个值弹出,否则说明整个序列存在问题,把fl…...
Stable Diffusion 绘画入门教程(webui)-ControlNet(深度Depth)
上篇文章介绍了线稿约束,这篇文章介绍下深度Depth 文章目录 一、选大模型二、写提示词三、基础参数设置四、启用ControlNet 顾名思义,就是把原图预处理为深度图,而深度图可以区分出图像中各元素的远近关系,那么啥事深度图…...
Rust-知多少?
文章目录 前言1.使用下划线开头忽略未使用的变量2. 变量解构3.常量4.变量遮蔽(shadowing)5. 类似println!("{}", x); 为啥加感叹号6.单元类型7. -> 运算符到哪去了?总结 前言 Rust 学习系列,记录一些rust使用小技巧…...
Qt不规则可移动窗体的实现
实现: 可以借助不规则的位图来实现不规则窗体,并支持拖动和移动。下面分别是头文件和源文件 #ifndef SHAPEWIDGET_H #define SHAPEWIDGET_H#include <QWidget>class ShapeWidget : public QWidget {Q_OBJECTpublic:ShapeWidget(QWidget *parent …...
Jakarta Bean Validation
Validation 官网 https://beanvalidation.org/ 常见注解 Bean Validation中定义的注解: 注解详细信息Null被注释的元素必须为 nullNotNull被注释的元素必须不为 nullAssertTrue被注释的元素必须为 trueAssertFalse被注释的元素必须为 falseMin(value)被注释的元素…...
Flink Catalog 解读与同步 Hudi 表元数据的最佳实践
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...
git 使用总结
文章目录 git merge 和 git rebasegit mergegit rebase总结 git merge 和 git rebase git merge git merge 最终效果说明: 假设有一个仓库情况如下,现需要进行 merge: merge 操作流程: merge 的回退操作: git reba…...
【Elasticsearch专栏 01】深入探索:Elasticsearch的正向索引和倒排索引是什么
文章目录 什么是Elasticsearch的正向索引和倒排索引?1.倒排索引(Inverted Index)2.正向索引(Forward Index)3.小结 什么是Elasticsearch的正向索引和倒排索引? 首先,要明确的是,Ela…...
Linux、Ubuntu、CenterOS、RedHat、Debian、AIpine关系和区别?
目录 1. 区别和联系 2. 安装命令 3. 其他发行版本 4. 拓展知识 Linux 内核和操作系统发行版的关系-CSDN博客 5.参考 1. 区别和联系 Ubuntu, Debian, RedHat, CentOS都是不同的Linux发行版。 Ubuntu 是基于Debian的一个开源GNU/Linux操作系统。它的目标是为一般用户提供…...
微信小程序开发:通过wx.login()获取用户唯一标识openid和unionid
下面代码展示了 openid 的获取过程。 想获取 unionid 需要满足条件:小程序已绑定到微信开放平台账号下,不然只会返回 openid。 【相关文档】 微信小程序开发:appid 和 secret 的获取方法 wx.login({success (res) {if (res.code) {// 发起网…...
设计模式之模板方法
模式定义 定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。 …...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
