Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?

说白了,Redis 6 .0中引入多播其实很简单。
进一步提高网络请求处理的并行性,突破单一网络I/O同步阻塞性能的网络瓶颈。
首先,最重要的报告。
Redis最初之所以采用单线程,是因为操作通常在内存中完成,CPU并不是瓶颈。
这实现了高可维护性,避免了线路切换开销,并使 I/O 技术非常高效。
其实一开始我以为一个线程就够了,后来发现我错了。
随着业务复杂度的增加,部分公司业务量达到亿级,需要更高的QPS,网络I/O处理成为瓶颈。
等等,还有别的事。
集群部署虽然可以提高性能,但是会消耗大量的资源。
Redis 6 .0引入多关系的背景是业务需求驱动,性能瓶颈是网络I/O。
从具体实现来看,只有网络请求模块采用了多线程,数据读写仍然由单线程完成,从而避免了线程安全问题。
此时我没有注意到很多人。
多线程可以同时处理网络请求,减少阻塞同步的影响,充分利用多核CPU,保持高性能和简单性。
我认为值得尝试,但也值得注意的是,引入多路复用器后,如何平衡线程数和CPU资源,避免过度消耗,是一个值得权衡的问题。

redis是单线程还是多线程,为什么

嗯...Redis...版本不同...线程模型也发生变化。
在 4 .0 之前...它是单线程的。
为什么?我想过...也许它很容易开发和维护。
想想看……如果你有多线程……你必须处理同步、争用和其他混乱的问题……代码必须很复杂……而且调试很困难。
简单的线程要容易得多。

还有一件事...Redis存储东西...主要在内存中...并且数据速率如此之高。
并且...它使用epoll(Linux)或kqueue(macOS)来执行非阻塞IO复用...单个线程...可以高效处理许多客户端请求。

还有...Redis的性能瓶颈...主要不是CPU...内存容量或者网络带宽...才是限制因素。
当CPU不忙的时候...内存或者网络可能满了...所以单线程...其实就够了。

所以...4 .0及以上版本...开始支持多线程。

在4 .0版本中...引入了惰性删除...异步删除功能。
比如...unlinkkey、flushdbasync、flushhallasync之类的命令...让后台线程做内存回收的任务...主线程就不会卡住...这样在删除大键值的场景下提高了性能。

至于6 .0版本...它添加了更多...多线程IO读写功能。
将主线程的IO任务拆分成独立的线程进行并行处理……这样可以充分利用多核CPU资源。

但是...命令执行...应该在主线程上串行完成...以便...数据一致。

配置...Redis 6 .0默认...不启用多线程。
需要修改配置文件redis.conf...才能打开。
设置 io-threads-do-readstrue... 并指定线程数... 比如说 io-threads4 官方推荐...线程数...小于CPU核心数。
例如...对于4 核CPU...设置2 -3 个线程...对于8 核CPU...设置6 ...以避免盲目竞争。

性能提升...Redis 6 .0的多线程特性...可以显着提高QPS。
测试说……在4 核CPU环境下……多线程版本……性能至少是单线程的两倍……而且……随着线程数的增加……还会进一步优化。

就是这样...

redis为什么是单线程的?

粗略来说,Redis的单线程模型其实非常简单。
我们先来说说最重要的事情。
Redis中的所有数据都存储在内存中。
内存访问速度极快,CPU 计算占用 Redis 运算的份额非常小。
例如,在我们去年运行的一个项目中,像 GET/SET 这样的命令只需要简单的内存读写或查找键值。
不需要复杂的计算,单个线程每秒可以轻松处理数万个请求。

还有一点是,性能瓶颈不是处理器,而是内存和网络。
例如,当数据量在3 000左右时,当数据量接近内存容量时,系统性能会因频繁交换或内存不足而下降。
网络带宽也是一个主要限制。
千兆网卡的理论吞吐量约为1 2 5 MB/s。
如果Redis响应数据量太大,网络传输将成为限制因素。

一开始我也认为多线程可以提高性能,但后来我意识到这是错误的。
上下文切换开销、竞争条件和多线程阻塞问题反而会成为性能瓶颈。
另一件事是,Redis 使用 I/O 多路复用和队列技术按照并发请求到达的顺序对它们进行排队。
单线程按照排队顺序一一处理请求,保证操作的原子性和一致性。

所以,我认为Redis选择单线程模型是因为权衡了其内存数据库的特点、性能瓶颈的位置以及实现的复杂度。
借助 I/O 多路复用和排队技术,单个线程可以实现高度并行处理,同时保持简单性和原子性。
对于CPU密集型任务,单个线程可能成为瓶颈,但Redis的设计通过优化内存操作和网络I/O来最小化这个问题。
等等,还有别的事。
Redis 6 .0引入了I/O线程并行处理读写网络请求,但核心数据操作仍然由单线程执行,是一种“多线程辅助单线程”的混合模式。
很多人没有注意到这一点,但我认为值得一试。

Redis 到底是单线程还是多线程呢?

Redis 6 .0版本引入了多线程,I/O处理是并行的,读写命令保留在单独的线程上。
默认关闭,需要触发触发器。