什么是Redis多线程

67次阅读
没有评论

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

这篇文章主要介绍“什么是 Redis 多线程”,在日常操作中,相信很多人在什么是 Redis 多线程问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是 Redis 多线程”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

周末被一位小同学憋的很窝火。他要和我探讨一下,redis 到底是多线程的还是单线程的。这个问题本来比较好解释,但我遇到的却是一个杠精。

答案是显而易见的:redis6,逃不过真香定理,引入了多线程;而在 redis6 之前,却是单线程的。

也就是说,这不是一个是和否的问题,还涉及到第二维度的版本参与。

可是,这位同学要打我的脸。不知道小姐姐的脸皮很嫩么?摸不得。

“照你的逻辑,redis5 是单线程的了?”

“是的。”

“那下面这张截图是怎么回事?”

同学甩给我一张图,并送来一个鄙视的眼神。

“使用 top -Hp 查看。redis5 有 4 个线程。该怎么解释?”

这个问题,我也不知道怎么跟他解释。使用 top 命令去观测,redis5 肯定是多线程的,比如 bgsave,aof 等,肯定要开启一个线程去操作,否则早就炸了。

按照这个逻辑去说,redis 就从来没有单进程过。看着这张图,我陷入了无尽的忧愁。

“Redis 是否是单进程,主要是针对 Redis 的读写操作来说的”。但这句话对于杠精并没有什么信服力。

“写程序要严谨,你们这些人都太不严谨了。多线程就是多线程,你应该问 redis 的读写操作到底是不是多线程的”。

我问你个大头鬼。我并不想再和他交流,因为我为自己的博学感到无地自容。

但他接下来的一个问题,却让我陷入了真正的沉思。

1. redis 的多线程有多快?

redis 的多线程到底有什么性能提升呢?

官方的说法是:possible to easily speedup two times。可能会比较容易的提升到两倍速度。

我英文不太好,对这种英文的修饰感到很迷惑。既然 easily 了,为什么还有 possible。two times,到底是提升了 2 倍,还是提升到 2 倍。

官方说,到底能够提升多少,还要看硬件的能力。

官方推荐,只有你的 CPU 核数,达到 4 个的时候,才有必要试一试这个多线程的 Feature。

不要用土豪的眼睛盯着我,这种 4core 的配置,已经打死了大多数公司了。所以 Redis 贴心的把多线程功能是关闭的。(好像有点语病)

我只能求助那些在一线的前同事们。他们有没有在生产环境,用上这划时代的多线程 Redis6x 呢?

结果很令我满意,没有!

其中有一个回复我特别满意。他说:“你竟然在问一个停留在 JDK1.6 的我,跑着 Windows 版本 Redis 的我,是否用到了 Redis6。我还在用着 Redis3 呢。”

另外一个回复我感到更满意,他说:“滚!”

2. 怎么用?

新技术肯定是要吹捧一下的,否则没人实践踩坑,作为追随者就只能吃翔。

多线程在理论上,肯定是会有性能提升的。一个爸爸赚钱和 2 个爸爸赚钱,效果自然不一样,只是苦了妈妈了。

Redis6 的多线程开启,需要配置一个参数。

io-threads 4

当开启之后,只有出流量使用多线程,如果你想要入流量也走多线程,那也可以配置以下参数。

io-threads-do-reads yes

就这么两个参数,可以看到现在的 redis 多线程,还是稍显寒碜了一些。

我们把它开启之后,仍然使用 top -Hp 查看相关进程,可以看到多了 3 个 io_thd 进程。

这部分逻辑,是在 networking.c 种实现的。这个文件已经达到了 3k 多行,也是够庞大的了。

3. Redis 为什么又搞多线程了

使用 redis-benchmark 测试,单机单核的吞吐量,能够达到 10w+。

1 秒是 1000000000 纳秒,单次内存操作大约是 100 纳秒左右,那内存操作可以达到 1000w/ s 的速度。那 Redis 的瓶颈在哪里呢?

使用 perf 进行追踪,可以发现它的耗时,主要是体现在 sys_write 系统调用上,也就是向 socket 写数据。

既然瓶颈找到了,那就把它优化掉。redis 选择的方式是使用多线程。

我使用 benchmark 测试了一下,4core 的机器,CPU 跑满的时候,QPS 达到了 16w,并没有翻倍(相对于单核的 9w/s)。

benchmark 6379 clients 32 164519.20 requests per second 165411.09 requests per second

用这么强的硬件,获得这样有限的性能提升,差强人意。

这就不难解释为什么现在实践的人那么少。出了因为新,还是不够吸引人。

毕竟,4core 的机器,我部署上 3 台 redis cluster 的实例,理论上会提升三倍呢。

redis 配置文件里,有不少内容在注释这个新特性。

4. 怎么实现?

如图,一次 redis 请求,要建立连接,然后获取操作的命令,然后执行命令,最后将响应的结果写到 socket 上。

在 redis 的多线程模式下,获取、解析命令,以及输出结果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点。

但命令的执行,也就是内存操作,依然是单线程运行的。

这种设计造成了一个特性。

redis 现在依然没有多线程的锁竞争和线程安全问题,因为它的数据读取这一步骤,仍然是单线程的,要排队运行。一些耗时的操作,比如 keys *,hgetall 等,仍然要注意。

redis 并不是传统的 reactor 模型,说实话很多东西硬套概念的话肯定只能钻进个头去漏出个尾巴。它也并不是 master,worker 这种干干净净的类似于 memcached 的模型,因为它把命令执行操作给抽取出来了。其中缘由,看上面这张图就够了。

到此,关于“什么是 Redis 多线程”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

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