【教3妹学Redis】4.为什么Redis的性能这么高?

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
坚持不懈,越努力越幸运,大家一起学习鸭~~~

3妹

2哥:3妹,这么晚了还不睡觉啊,在干嘛呢。
3妹:在学习呢,白天上班比较忙,只能在晚上的时间看会儿书了。
2哥:3妹加油,你尽早也会成为你羡慕的大牛的。
3妹:哈哈,多谢2哥。2哥,考考你,你知道redis为什么性能这么高吗?
2哥:这个不难,之前我也研究地,因为是基于内存、单线程、多路复用、特殊的数据结构等。
3妹:哇,2哥厉害,再给我讲讲呗。
2哥:行啊,不过说好,讲完就要睡觉了,熬夜对身体不好。身体是革命的本钱啊。
3妹:好的好的~

讲课

Redis为什么这么快

1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、数据结构简单,KV存储,对数据操作也简单,Redis中的数据结构是专门进行设计的;
例如SDS(简单动态字符串)是对C语言中的字符串频繁修改时,会频繁地进行内存分配,十分消耗性能,而SDS会使用空间预分配和惰性空间释放来避免这些问题的出现。 空间预分配技术: 对SDS进行修改时,如果修改后SDS实际使用长度为len,
当len<1M时,分配的空间会是2*len+1,也就是会预留len长度的未使用空间,其中1存储空字符
当len>1M时,分配的空间会是len+1+1M,也就是会预留1M长度的未使用空间,其中1存储空字符

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4、使用多路I/O复用模型,非阻塞IO;

5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

以上几点都比较好理解,下边我们针对多路 I/O 复用模型进行简单的探讨:

(1)多路 I/O 复用模型

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。

Redis为什么是单线程的?

Redis官方FAQ回答:
Redis是基于内存的操作,读取数据很快,不需要在某个线程读取数据时,切换到另一个线程来执行来提高CPU利用率,所以CPU不会成为瓶颈所在,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 (这里的单线程指的是处理客户端发送的请求命令的文件处理器模块是单线程,其他模块不一定是单线程的。从Redis 4.0版本后,Redis又逐渐引入了多线程。)

Redis采用单线程的优势:

  • 1.Redis项目的代码会更加清晰,处理逻辑会更加简单。
  • 2.不用考虑多个线程修改数据的情况,修改数据时不用加锁,解锁,也不会出现死锁的问题,导致性能消耗。
  • 3.不存在多进程或者多线程导致的切换而造成的一些性能消耗。

Redis采用单线程的劣势:

  • 1.无法充分发挥多核机器的优势,不过可以通过在机器上启动多个Redis实例来利用资源。(但是启动多个Redis实例可能会导致在进行AOF重写时,竞争IO资源,导致磁盘写入压力过大,所以可以使用脚本来触发实例的AOF重写,让所有实例的 AOF 串行执行。)
相关阅读

1.Redis概述 https://blog.csdn.net/kangbin825/article/details/127115470
2.Redis的底层数据结构 https://blog.csdn.net/kangbin825/article/details/127224138
3.Redis的过期策略和内存淘汰机制 https://blog.csdn.net/kangbin825/article/details/127239031

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值