我在使用套接字时遇到一些问题。我正在使用express-session来管理会话,它在redis上存储会话。
我想使用redis的连接池。 Express会话使用RedisStore,而RedisStore需要RedisClient,我不能给它池而不是RedisClient,
我的代码:
const Redis = require('ioredis')
const session = require('express-session')
const RedisStore = require('connect-redis').default
var redisClient = new Redis({ host: `redis`, port: 6379 })
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
})
connect-redis
在 Express.js应用程序中实现Redis 连接池,你确实可以使用
ioredis
包。ioredis
支持连接池,这意味着它在底层管理多个连接。
Express App
│
├─> express-session
│ │
│ └─> RedisStore ──> ioredis (Redis Client)
│
└─> Redis Server
但您似乎认为您需要显式地在其应用程序中配置或管理 Redis 连接池。
但是,
ioredis
会自动处理连接池。当您创建 Redis
的新实例时,就像您对 var redisClient = new Redis({ host: 'redis', port: 6379 })
所做的那样,ioredis
已经 有效地管理连接。通过 ioredis
发出的每个命令都会使用由 ioredis
内部管理的池中的可用连接进行排队和执行。ioredis
优化了开箱即用的连接使用和管理。
唯一的额外考虑因素是微调 Redis 客户端配置:
const Redis = require('ioredis');
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
// ioredis automatically manages a pool of connections
var redisClient = new Redis({
host: 'redis',
port: 6379,
// Additional options to manage the pool:
maxRetriesPerRequest: null, // Do not give up on a request
enableReadyCheck: true, // Only use ready instances
retryStrategy: (times) => Math.min(times * 50, 2000) // Increase delay between retries
});
redisClient.on('ready', () => { console.log(`Redis is ready @${redisClient.options.host}`) });
redisClient.on('error', (err) => { console.log('Redis error: ', err) });
const sessionAge = 24 * 60 * 60 * 1000; // Fixed to correct unit (milliseconds for one day)
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
});
redis/ioredis
问题470使用new redis.Cluster()
进行连接池,但对于单个Redis实例,ioredis
在内部处理连接池。
sessionAge
已更正为使用相当于 24 小时的毫秒,因为 express-session
预计该值以毫秒为单位。