关于redis 6.0 IO 多线程探秘,以及我的一些想法

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: redis 6.0 特性 多线程 IO线程

众所周知 redis 6.0 两个比较大的特性 一个是多线程IO 一个是ACL。

今天主要讲解下 IO 多线程特性,以及我的一些看法。结尾有对阿里云redis的一些调研彩蛋。哈哈


多线程的读IO逻辑

acceptCommonHandlerreadQueryFromClientpostponeClientReadhandleClientsWithPendingReadsUsingThreads/* 大概的io处理逻辑都在 postponeClientRead函数中汇总 所有io读事件,然后在 时间事件stopThreadedIOIfNeeded和beforeSleep函数中进行读事件的分发,然后处理命令。那么看下处理逻辑函数handleClientsWithPendingReadsUsingThreads将所有 postponeClientRead函数中新增的 client 队列分发给 每个io线程对应的io_threads_list[io_nums]这里主线程 mainthread 是当做 第一个IO线程来处理io的。通过io_threads_op来标志这次io线程是 io_threads_op读操作 还是 IO_THREADS_OP_WRITE 写操作。因为只有一个线程来操作这个 io_threads_op遍历,那么MESI可见性来说其他CPU都是可见最新的M变量的。setIOPendingCount(j, count); 设置变量处理标志。然后主线程处理完成自己的IO后 开始傻傻等待所有io处理完成。难道就不能做些其他的操作么,这点需要优化下。。比如:主从同步等操作。cpu空转总归不友好。*/while(1) {
unsignedlongpending=0;
for (intj=1; j<server.io_threads_num; j++)
pending+=getIOPendingCount(j);
if (pending==0) break;
            }
/*但是有一点就是 IO线程真的就是傻傻的看变量部分IOThreadMain 代码*//* Wait for start */for (intj=0; j<1000000; j++) {
if (getIOPendingCount(id) !=0) break;
        }
/* Give the main thread a chance to stop this thread. */if (getIOPendingCount(id) ==0) {
pthread_mutex_lock(&io_threads_mutex[id]);
pthread_mutex_unlock(&io_threads_mutex[id]);
continue;
        }
//最后设置自己完成io的标志setIOPendingCount(0)

写IO是如何调用的

//写的逻辑几乎和读一直这里就简单说下在哪里调用执行beforeSleephandleClientsWithPendingWritesUsingThreads/*总体逻辑和读一样 所有io分发io任务,主线程等待完成,完成后又剩余的主从IO事件*/

总体逻辑


引用一个图,懒得画了,大概就是这样

微信图片_20211225162646.png

彩蛋来了

io_threaded_reads_processed:0io_threaded_writes_processed:0

经过对redis主从高可用的实例 压测,可以看到 这个值标志这 社区版的6.0 也是没有开启io线程的。因为对于io线程来说 太影响cpu使用和 抢占了对云环境的应用不是很友好,因为亲和性这些东西也不是很确定的特性。只有在资源分配的时候 剩余多一点cpu资源减少抢占,从而满足客户的 低延迟等问题。


个人意见就是 虚拟环境下 所有的IO线程和 网卡多队列都放到某个socket的 某些cpu的亲缘性高一点,主线程尽量独立cpu亲缘性,从而让 主线程的抢占概率降低。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
15天前
|
监控 NoSQL 安全
如何在 Redis 中正确使用多线程?
【10月更文挑战第16天】正确使用 Redis 多线程需要综合考虑多个因素,并且需要在实践中不断摸索和总结经验。通过合理的配置和运用,多线程可以为 Redis 带来性能上的提升,同时也要注意避免可能出现的问题,以保障系统的稳定和可靠运行。
31 2
|
15天前
|
存储 NoSQL Redis
Redis 新版本引入多线程的利弊分析
【10月更文挑战第16天】Redis 新版本引入多线程是一个具有挑战性和机遇的改变。虽然多线程带来了一些潜在的问题和挑战,但也为 Redis 提供了进一步提升性能和扩展能力的可能性。在实际应用中,我们需要根据具体的需求和场景,综合评估多线程的利弊,谨慎地选择和使用 Redis 的新版本。同时,Redis 开发者也需要不断努力,优化和完善多线程机制,以提供更加稳定、高效和可靠的 Redis 服务。
29 1
|
25天前
|
存储 运维 NoSQL
Redis为什么最开始被设计成单线程而不是多线程
总之,Redis采用单线程设计是基于对系统特性的深刻洞察和权衡的结果。这种设计不仅保持了Redis的高性能,还确保了其代码的简洁性、可维护性以及部署的便捷性,使之成为众多应用场景下的首选数据存储解决方案。
36 1
|
1月前
|
NoSQL Redis 数据库
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
本文解释了Redis为什么采用单线程模型,以及为什么Redis单线程模型的效率和速度依然可以非常高,主要原因包括Redis操作主要访问内存、核心操作简单、单线程避免了线程竞争开销,以及使用了IO多路复用机制epoll。
41 0
Redis单线程模型 redis 为什么是单线程?为什么 redis 单线程效率还能那么高,速度还能特别快
|
2月前
|
NoSQL 网络协议 Unix
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
53 1
|
2月前
|
存储 消息中间件 NoSQL
Redis的单线程设计之谜:高性能与简洁并存
Redis的单线程设计之谜:高性能与简洁并存
41 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
4月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
2月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
41 2