单线程的 Redis,不是快吗?为什么需要连接池?

敏捷开发 herman 388浏览
公告:“业余草”微信公众号提供免费CSDN下载服务,关注业余草微信公众号,添加作者微信:xmtxtt,发送下载链接帮助你免费下载!
本博客日IP超过1300,PV 1800 左右,急需赞助商。
打开支付宝首页搜“567452957”领红包,间接赞助博主,谢谢!

最近一位大佬,工号粉丝好几万了。拉了好几个微信交流群,我也在其中一个,群里大多数人都不说话,说话的都是“红包”等广告!

广告群

一大早都忙着抢各种红包,于是,我就在群里问了一下大家!单线程的 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 采用一个线程来处理就再正常不过了!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 单线程的 Redis,不是快吗?为什么需要连接池?