redis是单线程分析

47次阅读
没有评论

共计 1752 个字符,预计需要花费 5 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍 redis 是单线程分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

以前一直有个误区,以为:高性能服务器   一定是 多线程来实现的

原因很简单因为误区二导致的:多线程 一定比 单线程   效率高。其实不然。

在说这个事前希望大家都能对  CPU、内存、硬盘的速度都有了解了,这样可能理解得更深刻一点,不了解的朋友点:CPU 到底比内存跟硬盘快多少

redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。

redis 用单个 CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个 CPU 上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。(推荐:《redis 视频教程》)

因为一次 CPU 上下文的切换大概在 1500ns 左右。

从内存中读取 1MB 的连续数据,耗时大约为 250us,假设 1MB 的数据由多个线程读取了 1000 次,那么就有 1000 次时间上下文的切换,

那么就有 1500ns * 1000 = 1500us,我单线程的读完 1MB 数据才 250us , 你光时间上下文的切换就用了 1500us 了,我还不算你每次读一点数据 的时间,

那什么时候用多线程的方案呢?

答案是:下层的存储等慢速的情况。比如磁盘

内存是一个 IOPS 非常高的系统,因为我想申请一块内存就申请一块内存,销毁一块内存我就销毁一块内存,内存的申请和销毁是很容易的。而且内存是可以动态的申请大小的。

磁盘的特性是:IPOS 很低很低,但吞吐量很高。这就意味着,大量的读写操作都必须攒到一起,再提交到磁盘的时候,性能最高。为什么呢?

如果我有一个事务组的操作(就是几个已经分开了的事务请求,比如写读写读写,这么五个操作在一起),在内存中,因为 IOPS 非常高,我可以一个一个的完成,但是如果在磁盘中也有这种请求方式的话,

我第一个写操作是这样完成的:我先在硬盘中寻址,大概花费 10ms,然后我读一个数据可能花费 1ms 然后我再运算(忽略不计),再写回硬盘又是 10ms,总共 21ms

第二个操作去读花了 10ms, 第三个又是写花费了 21ms , 然后我再读 10ms, 写 21ms,五个请求总共花费 83ms,这还是最理想的情况下,这如果在内存中,大概 1ms 不到。

所以对于磁盘来说,它吞吐量这么大,那最好的方案肯定是我将 N 个请求一起放在一个 buff 里,然后一起去提交。

方法就是用异步:将请求和处理的线程不绑定,请求的线程将请求放在一个 buff 里,然后等 buff 快满了,处理的线程再去处理这个 buff。然后由这个 buff 统一的去写入磁盘,或者读磁盘,这样效率就是最高。java 里的 IO 不就是这么干的么~

对于慢速设备,这种处理方式就是最佳的,慢速设备有磁盘,网络,SSD 等等,

多线程,异步的方式处理这些问题非常常见,大名鼎鼎的 netty 就是这么干的。

终于把 redis 为什么是单线程说清楚了,把什么时候用单线程跟多线程也说清楚了,其实也是些很简单的东西,只是基础不好的时候,就真的尴尬。。。。

补一发大师语录:来说说,为何单核 cpu 绑定一块内存效率最高

“我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以我们可以手动地为其分配 CPU 核,而不会过多地占用 CPU”,默认情况下单线程在进行系统调用的时候会随机使用 CPU 内核,为了优化 Redis,我们可以使用工具为单线程绑定固定的 CPU 内核,减少不必要的性能损耗!

redis 作为单进程模型的程序,为了充分利用多核 CPU,常常在一台 server 上会启动多个实例。而为了减少切换的开销,有必要为每个实例指定其所运行的 CPU。

Linux 上  taskset 可以将某个进程绑定到一个特定的 CPU。你比操作系统更了解自己的程序,为了避免调度器愚蠢的调度你的程序,或是为了在多线程程序中避免缓存失效造成的开销。

以上是 redis 是单线程分析的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

丸趣 TV 网 – 提供最优质的资源集合!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-18发表,共计1752字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)