如何使用池与express-session和connect-redis进行redis连接

问题描述 投票:0回答:1

我在使用套接字时遇到一些问题。我正在使用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
})
node.js express-session ioredis connect-redis
1个回答
0
投票

你是对的:要使用 express-session

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
预计该值以毫秒为单位。
到位的错误处理和日志记录将提供 Redis 连接运行状况的可见性。

© www.soinside.com 2019 - 2024. All rights reserved.