最近一位大佬,工号粉丝好几万了。拉了好几个微信交流群,我也在其中一个,群里大多数人都不说话,说话的都是“红包”等广告!
一大早都忙着抢各种红包,于是,我就在群里问了一下大家!单线程的 Redis,不是快吗?为什么需要连接池?有知道的吗?
然后,我就静静地等。没一个人回答问题,可能是问题太简单了吧!唯一的一个网友,回了一个表情:你好过分我一定要截屏发给马化腾让他封你号!
这就是我一再强调为什么群里不能发广告的原因,一发就不可收拾了,就真的成了广告群了,没人交流了!
下面,我就这个问题,说一下我的个人理解。
先说一下,Redis 为什么是单线程的?
因为 CPU 不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽。(以上主要来自官方 FAQ)既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于 redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求,参见:How fast is Redis?
另外,也可以参考我去年 8 月份的一篇文章《Redis 是单线程结构,但为何单线程还能支持高并发?》。
为什么使用连接池?
Redis 是单进程单线程的,它利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。
Redis 是基于内存的数据库,使用之前需要建立连接,建立断开连接需要消耗大量的时间。
再假设 Redis 服务器与客户端分处在异地,虽然基于内存的 Redis 数据库有着超高的性能,但是底层的网络通信却占用了一次数据请求的大量时间,因为每次数据交互都需要先建立连接,假设一次数据交互总共用时 30ms,超高性能的 Redis 数据库处理数据所花的时间可能不到 1ms,也即是说前期的连接占用了 29ms,连接池则可以实现在客户端建立多个连接并且不释放,当需要使用连接的时候通过一定的算法获取已经建立的连接,使用完了以后则还给连接池,这就免去了数据库连接所占用的时间。
Jedis resource = jedisPool.getResource();
注意,这行代码。我们从 JedisPool 中获取的仅仅是一个连接。至于多个连接到达单进程单线程的 Redis 之后怎么处理,就与你的线程池无关了。
实际上,Redis 在收到多个连接后,采用的是非阻塞 IO,基于 epoll 的多路 IO 复用。
然后采用队列模式将并发访问变为串行访问,对于串行访问,本身操作内存就很快,Redis 采用一个线程来处理就再正常不过了!
: » 单线程的 Redis,不是快吗?为什么需要连接池?
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/252337.html