何时关闭nodejs路由中的redis连接

68bkxrlz  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(234)

我正在构建一个node.js webapp,它使用redis连接。我已经将redis凭证存储在数据库中,因此建立redis连接是一项异步任务。
这是我目前app.js的代码:

// app.js

'use strict'
const express = require('express')
const Http = require('http')
const app = express()
const http = Http.createServer(app)

// wait for the event 'ready' to start listening for requests
// otherwise it will return an error
app.on('ready', () =>
    http.listen(process.env.PORT, () => console.log(`Server listening on port ${process.env.PORT}`))
)

const Redis = require('./redis')

Redis().then(redis => {
    app.set('redis', redis)
    app.emit('ready')
})

const Routes = require('./routes')(app)

问题1
将redis连接存储到app变量中是一种好的做法。我将'app'变量传递给我需要的其他模块(例如“路由器”)。我现在挣扎了几个星期如何处理数据库连接。我记录每个redis连接,在这之前,当我启动服务器时,我看到了很多“redis connected”消息,因为我在每个模块中都创建了一个新的redis客户端。现在我只看到一个,它似乎工作。注意:我还使用了一个postgresql数据库,我对这个连接也是这样做的。这两个连接都可以工作,而且我没有看到以前的任何错误(比如连接超时或连接太多)。
这是我的routes.js代码:

// routes.js

const routes = (app) => {
    app.get('/set', async (req, res) => {
        await app.get('redis').set('foo', 'bar')

        res.status(200).json({ response: 'foo set' }) // should output {"response":"foo set"}
    })

    app.get('/get', async (req, res) => {
        let response = await app.get('redis').get('foo')

        // should return 'bar'
        res.status(200).json({ response }) // should output: {"response":"bar"}
    })
}

module.exports = routes

如您所见,在routes.js中,我有一个全局函数,它接受app作为参数,在route函数中,我使用之前通过app.get('redis')建立的redis连接。
问题2
我应该调用吗?如果是,我应该在哪里调用redis.quit()(或者在我的例子中:app.get('redis').quit)?我是这方面的初学者,所以我不知道什么时候应该调用redis.quit()。我是否应该在结尾的每个单独的route函数中调用redis.quit()?或者我应该这样做(在app.js中):

process.on('SIGINT', function() {
    app.get('redis').quit();
    console.log('redis quit');
});

为我的redis连接设置空闲超时是更好的解决方案吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题