Java研究院 Java研究院

人非生而知之者,知之,而后知不知。

目录
Redis不是单线程吗?为什么还会有连接池?
/    

Redis不是单线程吗?为什么还会有连接池?

首先说明一下,Redis6.0之前版本是单线程,6.0往后版本,加入了多线程支持。

redis为什么是单线程的

那么为什么长久以来,redis是单线程的?因为 CPU 不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽(以上主要来自官方说明)。因为通常意义上来讲,多线程是为了提高CPU的利用率,而Redis在单线程的情况下,能轻松达到十万+并发处理量,可见CPU对redis的性能影响确实微乎其微。

为什么使用连接池?

Redis是单进程单线程的

它利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

Redis是基于内存的数据库

使用之前需要建立连接,建立断开连接需要消耗大量的时间。从数据库连接池我们也能联想到,你的Spring项目中,可少不了这个配置。

再假设 Redis 服务器与客户端分处在异地,虽然基于内存的 Redis 数据库有着超高的性能,但是底层的网络通信却占用了一次数据请求的大量时间,因为每次数据交互都需要先建立连接,假设一次数据交互总共用时 30ms,超高性能的 Redis 数据库处理数据所花的时间可能不到 1ms,也即是说前期的连接占用了 29ms,连接池则可以实现在客户端建立多个连接并且不释放,当需要使用连接的时候通过一定的算法获取已经建立的连接,使用完了以后则还给连接池,这就免去了创建连接所占用的时间。

Jedis resource = jedisPool.getResource();

注意这行代码。我们从 JedisPool 中获取的仅仅是一个连接。至于多个连接到达单进程单线程的 Redis 之后怎么处理,就与你的线程池无关了。

实际上,Redis 在收到多个连接后,采用的是非阻塞 IO,基于 epoll 的多路 IO 复用。

然后采用队列模式将并发访问变为串行访问,对于串行访问,本身操作内存就很快,Redis 采用一个线程来处理就再正常不过了!


才疏学浅,难免有坑,有坑也不填
标题:Redis不是单线程吗?为什么还会有连接池?
地址:https://studying.icu/articles/2021/09/22/1632303633744.html