所以从上面的结论来看,nodejs+redis只需要共享一个连接,所以不需要使用连接池。
我们来看看nodejs+mysql下的情况。
不同的是mysql不是单线程的,也就是可以并行处理多个查询请求。
如上所示,mysql将为每个要查询的连接创建一个单独的线程。不像redis,数据基本都在内存中,因为mysql会有大量的IO操作来读取磁盘,所以多线程协同工作会比一个查询更快。
但是nodejs是单线程的,可以同时向mysql服务器发送多个请求吗?
这里要理解nodejs的操作,虽然nodejs是一个主线程,但是它调用的IO指令是由另一个线程完成的。IO指令完成后,给主线程一个小任务片,也就是回调函数。
这里的关键点是nodejs有一个主线程,但是会有多个IO线程。
因此,如果nodejs+mysql只使用单个连接,它将无法利用mysql同时服务多个查询的能力。它应该以类似下图的方式工作。nodejs使用多个连接来连接mysql。多连接需要连接池,这避免了创建和销毁每个连接的消耗。
所以我们的第一感觉是,认为Nodejs是单线程,不需要连接池的想法是错误的。它不仅依赖于客户端,还依赖于数据库服务器。我们必须充分了解整个系统的运行模式,才能得出结论。了解服务器的运行方式,是否有阻塞运行,是否多线程等。我觉得redis之所以设计成单线程,主要是因为它的数据基本都在内存中,查询数据的过程绝不会产生阻塞进程,cpu也不会处于空空闲状态。
全局断开和重新连接问题
它不在这里。基于以上分析,nodejs+mysql使用线程池是没有问题的。Nodejs+redis只需要一个连接。但是,有些人仍然建议需要连接池。为了说明问题,我们必须从代码开始。我们使用包node-redis作为例子。
例如,创建了一个新的db.js。
var redis = require("redis"),client = redis.createClient(6379, "127.0.0.1");module.exports = client;上述连接将在程序启动并加载后连接。当您使用它时,您可以通过引入它来使用一个全局唯一的连接。
var db = require("db.js");exports.add = function(req, res, next) { db.get("keyName", function() {res.send("ok");});}所以这里就出现了这样一个问题。
但是这里整个世界只有一个连接,这个连接是在程序启动的时候创建的。它不同于连接池中的连接,连接池是在运行时动态创建的。如果唯一的连接在某个时候断了,程序就不会动态创建连接,所以需要重启服务器。
看起来很可怕,但幸运的是这个问题不存在。不需要重启服务器,因为redis的客户端会自动重新连接。
但由于连接短时间断开,应用服务器无法正常为外界服务,而是需要一定的时间间隔连接才能自动重新连接。例如,一秒钟后,系统在这一秒钟内停止服务。
也是基于以上原因,所以才有了连接redis使用连接池的做法。如果连接池用于管理,请在连接不可用时立即手动创建新连接。与自动重连相比,一种是立即手动重连,另一种是等待一定间隔再重连。相对来说,手动重连的时间更短,也就是说,1秒内系统无法服务的状态可能会缩短到0.5秒。于是就有了用连接池管理redis连接的做法。严格来说,这不是连接池,而是连接管理模块。
这里最后的结论是nodejs+mysql使用连接池更好,nodejs+redis可以用也可以不用。
adminjs.cn是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 Adminjs.cn还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 在Adminjs.cn中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!