您的位置:首页 > 数据库 > Redis

单线程的Redis为什么辣么快???

2019-10-21 08:45 1361 查看

互联网重磅级杀手锏Redis火遍大江南北,而它的很多应用神技却不为所知。

Redis到底有多快?

Redis采用的是基于内存的是单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。

道redis是单线程工作模型吗?

“单线程的Redis为什么这么快?”大厂面试官经常会这么问。

这个问题其实是对redis内部机制的一个考察。答主要有以下3点:

(一)纯内存操作;
(二)单线程操作,避免了频繁的上下文切换;
(三)采用了非阻塞I/O多路复用机制;
我们要仔细说一说I/O多路复用机制,一般人都不懂是什么意思。我来打个比方:小明在S城开了一家快递店,负责同城快送服务。小明因为资金限制,雇佣了一批快递员,然后小明发现资金不够了,只够买一辆车送快递。
经营方式一:
客户每送来一份快递,小明就让一个快递员盯着,然后快递员开车去送快递。
慢慢小明发现了这种经营方式存在的问题:

几十个快递员基本上时间都花在了抢车上了,大部分快递员都处在闲置状态,谁抢到了车,谁就能去送快递;

随着快递的增多,快递员也越来越多,小明发现快递店里越来越挤,没办法雇佣新的快递员了;

快递员之间的协调很花时间;

综合上述缺点,小明痛定思痛,提出了下面的经营方式。
经营方式二:
小明只雇佣一个快递员。然后呢,客户送来的快递,小明按送达地点标注好,然后依次放在一个地方。最后,那个快递员依次的去取快递,一次拿一个,然后开着车去送快递,送好了就回来拿下一个快递。

上述两种经营方式对比,是不是明显觉得第二种,效率更高,更好呢。在上述比喻中:

每个快递员------------------>每个线程

每个快递-------------------->每个socket(I/O流)

快递的送达地点-------------->socket的不同状态

客户送快递请求-------------->来自客户端的请求

小明的经营方式-------------->服务端运行的代码

一辆车---------------------->CPU的核数

于是我们有如下结论:
1、经营方式一就是传统的并发模型,每个I/O流(快递)都有一个新的线程(快递员)管理。
2、经营方式二就是I/O多路复用。只有单个线程(一个快递员),通过跟踪每个I/O流的状态(每个快递的送达地点),来管理多个I/O流。

下面类比到真实的redis线程模型,如图所示:
参照上图,简单来说,就是我们的redis-client在操作的时候,会产生具有不同事件类型的socket。在服务端,有一段I/0多路复用程序,将其置入队列之中。然后,文件事件分派器,依次去队列中取,转发到不同的事件处理器中。
需要说明的是,这个I/O多路复用机制,redis还提供了select、epoll、evport、kqueue等多路复用函数库,大家可以自行去了解。

关于Redis,再看看以下这些,你掌握了多少?

1、String、List、Hash、Set、Zset类型使用场景;

2、时间轴、队列应用场景设计实战;

3、购物车开发与设计实战;

4、Redis与Lua模拟抢红包实战;

5、网站投票设计与开发实战;

6、Lua+Redis联合开发指南;

7、Redis慢操作优化;

8、Redis哨兵机制及底层机制分析;

9、10分钟搭建Redis高可用集群实战;

10.21-10.23晚上8点一线资深架构师James老司机将手把手教你深度掌握这些Redis核心技能


Redis销魂操作实战》

10.21-10.23晚上8点准时直播


10月21日 Redis狂澜BAT真相分析

1、Redis快速入门指南;

2、Redis数据结构解析;

3、缓存雪崩与穿透解析;

4、Redis持久化解析;


10月22日 Redis性能测试及手写实战

1、微博关系设计实战;

2、微信关注设计实战;

3、抽奖程序设计实战;

4、分布式锁设计实战;



10月23日 Redis性能测试及手写实战

1、Redis性能测试实战;

2、Redis的底层协议实战;

3、手写Redis客户端实战;

4、将系统改成Redis实战;


添加微信报名,领取课程资料包

发送“666”限时扫码领取,先到先得

附赠Java架构进阶资料

“愿你一路披荆斩棘,收获黎明。”


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: