如何在express-session与connect-redis中使用Redis连接池
解决express-session结合RedisStore使用连接池的问题
你不需要单独创建连接池实例再传给RedisStore——ioredis本身已经内置了连接池支持,只需要在初始化Redis客户端时配置连接池相关参数,再把这个客户端传给RedisStore即可,完全兼容connect-redis的要求。
具体修改方案:
在创建Redis客户端时,添加连接池相关配置项,比如poolSize(连接池最大连接数)、maxRetriesPerRequest(每个请求的最大重试次数)等,示例代码如下:
const Redis = require('ioredis') const session = require('express-session') const RedisStore = require('connect-redis').default // 初始化带连接池配置的Redis客户端 const redisClient = new Redis({ host: 'redis', port: 6379, poolSize: 10, // 连接池最大连接数,可根据业务需求调整 maxRetriesPerRequest: 2, // 每个请求的最大重试次数 enableReadyCheck: true // 启用就绪检查,确保连接成功后再执行操作 }) redisClient.on('ready', () => { console.log(`Redis is ready @${redisClient.options.host}`)}) redisClient.on('error', (err) => { console.log('Redis error: ', err) }) const sessionAge = 24 * 60 * 1000 module.exports = session({ store: new RedisStore({ client: redisClient }), key: 'sid', secret: 'secret', saveUninitialized: false, resave: false, rolling: false, cookie: { secure: false, maxAge: sessionAge, sameSite: 'lax' }, expires: sessionAge })
原理说明:
ioredis的客户端实例默认会用连接池管理Redis连接,你配置的poolSize等参数会直接作用于内置连接池。connect-redis只需要一个标准的Redis客户端实例(不管是否带连接池配置)就能正常读写会话数据,完全不需要额外处理连接池的传递问题。
内容的提问来源于stack exchange,提问作者Sinan AKYAZICI
相关产品推荐
相关产品推荐

