其它开源软件采用的模型
Nginx:多进程单线程模型
Memcached:单进程多线程模型
Redis:单进程单线程
单线程的redis为什么这么快
主要是以下三点
(一)纯内存操作
数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
(二)单线程操作,避免了频繁的上下文切换
避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
多线程处理可能涉及到锁
多线程处理会涉及到线程切换而消耗CPU
多线程对同一个Key操作时,Redis服务是根据先到先作的原则,其他排队(可设置为直接丢弃),因为是单线程。
修改默认的超时时间,默认2秒。但是大部份的操作都在30ms以内。
(三)采用了非阻塞I/O多路复用机制
内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间
(四)数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
我们使用单线程的方式是无法发挥多核CPU 性能,不过我们可以通过在单机开多个Redis 实例来完善!
警告:这里我们一直在强调的单线程,只是在处理我们的网络请求的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的,这里需要大家明确的注意一下!
例如Redis进行持久化的时候会以子进程或者子线程的方式执行(具体是子线程还是子进程待读者深入研究)
Redis为什么是单线程的?
因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽。
既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求,参见:How fast is Redis?
如果万一CPU成为你的Redis瓶颈了,或者,你就是不想让服务器其他核闲置,那怎么办?
那也很简单,你多起几个Redis进程就好了。Redis是keyvalue数据库,又不是关系数据库,数据之间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。redis-cluster可以帮你做的更好。
单线程可以处理高并发请求吗?
当然可以了,Redis都实现了。有一点概念需要澄清,并发并不是并行。
(相关概念:并发性I/O流,意味着能够让一个计算单元来处理来自多个客户端的流请求。并行性,意味着服务器能够同时执行几个事情,具有多个计算单元)
单线程处理的缺点?
无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善
单进程单线程的Redis如何能够高并发
采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
Redis不存在线程安全问题?
Redis采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁
redis的一些其他特点:
(1)Redis是单进程单线程的
redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销
(2)读写分离模型
通过增加Slave DB的数量,读的性能可以线性增长。为了避免Master DB的单点故障,集群一般都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高。
读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。
(3)数据分片模型
为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。
可以将每个节点看成都是独立的master,然后通过业务实现数据分片。
结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。
(4)Redis的回收策略
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。
使用策略规则:
1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
redis常见性能问题和解决方案:
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照;
AOF文件过大会影响Master重启的恢复速度)
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
1. Redis服务端是个单线程的架构,不同的Client虽然看似可以同时保持连接,但发出去的命令是序列化执行的,这在通常的数据库理论下是最高级别的隔离(serialize)
2. 用MULTI/EXEC 来把多个命令组装成一次发送,达到原子性
3. 用WATCH提供的乐观锁功能,在你EXEC的那一刻,如果被WATCH的键发生过改动,则MULTI到EXEC之间的指令全部不执行,不需要rollback
4. 其他回答中提到的DISCARD指令只是用来撤销EXEC之前被暂存的指令,并不是回滚
相关推荐
docker imagedocker-compose
COMSOL 21700电池针刺热失控实验与结果分析,comsol 21700针刺热失控 ,comsol; 21700针; 刺热失控,COMSOL研究:21700电池针刺热失控现象解析
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1、文件内容:perl-File-ShareDir-1.03-8.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-File-ShareDir-1.03-8.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"深入探究蠕动流与Brinkman达西定律在COMSOL模拟中的应用",蠕动流、Brinkman 达西定律COMSOL ,蠕动流; Brinkman 达西定律; COMSOL,**利用达西定律与Brinkman模型分析蠕动流现象**
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+录屏+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
JRT 0287-2023 人工智能算法金融应用信息披露指南.pdf
西门子S7协议纯指令编写源代码,支持多区域数据通信读写:Qx.y与Mx.y的单点操作,Byte、Word、DWORD的全面读写,以及V区浮点数处理,西门子S7协议通信,纯指令编写,不调用dll。 源代码 实现以下功能, 1,对单点读写,Qx.y,Mx.y的写入,Ix.y的读取。 2,对Byte,Word,DWORD的读写,支持读写Q区,I区,M区,V区。 3,对浮点数的读写,支持V区。 以上功能已经在S7 Smart PLC上测试过,带网口的CR40 CR60已支持。 ,西门子S7协议通信;纯指令编写;单点读写;Qx.y、Mx.y写入;Ix.y读取;Byte、Word、DWORD读写;Q区、I区、M区、V区读写;浮点数读写;S7 Smart PLC测试;网口CR40 CR60支持,西门子S7协议通信纯指令编写:PLC多区域读写及浮点数操作实现
matlab绘图 采用PreScan、ROS、Simulink进行自动驾驶控制算法仿真 横向控制采用的是stanley,MPC算法 使用说明 0分支说明 master分支:运行在ros端的控制算法,包括stanley,mpc。 PreScan分支:包含了prescan工程的压缩文件,解压后需要在matlab中添加自定义的ros msg,也就是src/nodes/msgs 配合控制程序,可以直接进行prescan-ros仿真。 1环境说明 PC1:装win10系统;运行prescan2019.2和matlab2019b;ip = 172.16.6.248 PC2:Ubuntu18.04,ros melodic;ip = 172.16.6.70 p.s. PC1和PC2应该处于同一网段下 2PC2(ubuntu18.04)操作说明 clone master分支的代码后 2.1修改PC2的.bashrc文件,向其中添加PC2的ip地址 sudo gedit ~/.bashrc #打开bashrc #在bashrc文件的末尾添加如下两行 export ROS_IP=172.16.
B2B2C2021H5 + 100% PHP8.2 + Laravel10.0
内容概要:本文详细介绍了C++从基础语法、面向对象编程到高级特性等方面的编程要点,包括变量与数据类型、运算符与表达式、控制结构、类与对象、封装、继承、多态等核心概念,并深入探讨了C++在游戏开发、人工智能、操作系统开发等热门领域的具体应用案例。此外,还讲解了C++在模板、异常处理和智能指针方面的高级功能。最后总结了C++在现代科技发展中扮演的重要角色和未来的应用前景。 适合人群:具备一定编程背景的开发者,特别是对C++语言感兴趣的初级至中级程序员。 使用场景及目标:①希望通过本文深入了解C++的各个方面,并在实践中更好地应用;②提升C++编程技能,在涉及高性能计算、嵌入式系统、人工智能等领域时能够得心应手;③掌握最新的C++技术和趋势,为应对未来技术变革做好准备。 其他说明:本文不仅讲述了C++的基本理论知识,还在多个实际案例中展示了如何运用这些知识解决问题,帮助读者更好地理解C++的特点与优势。
Matlab
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
"深入解析S7-200组态王液位串级控制:双容带前馈与反馈的梯形图接线图原理及IO分配与组态画面详解",No.92 S7-200组态王液位串级控制,双容带前馈和反馈 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,S7-200组态王液位;串级控制;双容带前馈和反馈;梯形图接线图原理图;IO分配;组态画面,"S7-200液位串级控制:双容前馈反馈组态原理图及IO分配详解"
1、文件内容:perl-Config-Simple-4.59-15.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-Config-Simple-4.59-15.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
"S7-1200 PLC改造No.173 M7120型平面磨床电气控制系统:原理图、接线图及IO分配与组态画面详解",No.173 S7-1200 MCGS M7120型平面磨床电气控制系统的PLC改造 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,核心关键词:S7-1200 PLC; MCGS M7120型平面磨床; 电气控制系统; 改造; 梯形图接线图原理图; IO分配; 组态画面。,"S7-1200 PLC改造平面磨床电气控制系统方案"
Matlab算法:结构与参数学习在贝叶斯网络构建中的应用,实现因果推断与条件概率计算,数据程序分离,注释详尽易理解,Matlab算法:结构学习、参数学习建个贝叶斯网络 Matlab算法:贝叶斯网络因果推断,通过结构学习、参数学习建立贝叶斯网络,给定证据,获得指定特征的条件概率。 数据程序分开,便于使用,注释详细,助于理解 ,结构学习; 参数学习; 贝叶斯网络; 因果推断; 条件概率; 数据程序分离; 注释详细。,Matlab实现贝叶斯网络结构学习与参数学习算法
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。