获取 connect-redis 上的现有会话列表
Get list of existing sessions on connect-redis
我必须实现一项功能,如果登录用户数超过允许的用户数,则不应允许更多用户登录。有没有办法获取 running/existing 会话的列表?以及如何销毁特定会话?谁能提供一个例子,因为我是 node.js 的新手。我的部分代码是:
express = require('express'),
session = require('express-session'),
RedisStore = require('connect-redis')(session),
bodyParser = require('body-parser');
redisOpts = {
pass: config.REDIS_PASS,
host: config.REDIS_SERVER || null,
port: config.REDIS_PORT || null
},
sessionStore = new RedisStore(redisOpts),
app = express();
app.use(session({
store: sessionStore,
secret: 'XXX',
resave: true,
saveUninitialized: true
}));
编辑
express = require('express'),
session = require('express-session'),
redis = require("redis"),
RedisStore = require('connect-redis')(session),
bodyParser = require('body-parser');
redisOpts = {
pass: config.REDIS_PASS,
host: config.REDIS_SERVER || null,
port: config.REDIS_PORT || null
},
redisClient = redis.createClient(redisOpts.port, redisOpts.host, { auth_pass: redisOpts.pass }),
sessionStore = new RedisStore(redisClient),
app = express();
app.use(session({
store: sessionStore,
secret: 'XXX',
resave: true,
saveUninitialized: true
}));
并且在 app.js 内部登录函数中,如果检查会话列表:
redisClient.keys("sess:*", function(error, keys){
console.log("Number of active sessions: ", keys.length);
console.log(keys);
});
此编辑后,它在 connect-redis.js 的这一行中抛出错误:
TypeError: this.client.unref is not a function
if (options.unref) this.client.unref();
感谢任何帮助。
非常感谢。
不过您需要直接查询 redis 集合。
由于 connect-redis 在内部使用 redis.createClient()
,您可以传递 redis 客户端实例而不是凭据。类似于:
//I've kept your redisOpts for clarity
redisOpts = {
pass: config.REDIS_PASS,
host: config.REDIS_SERVER || null,
port: config.REDIS_PORT || null
},
var redisClient = redis.createClient(redisOpts.port, redisOpts.host, { auth_pass: redisOpts.pass });
现在,像以前一样配置您的 redis 存储,但传入 redisClient
sessionStore = new RedisStore(redisClient)
您现在可以使用相同的 redisClient
来查询会话密钥的数量
redisClient.keys("sess:*", function(error, keys){
console.log("Number of active sessions: ", keys.length);
});
我通常为每个会话设置一个名称,例如:
var redis_client = redis.createClient();
redis_client.client('setname', 'tour-client');
然后当我想检查它时:
redis_client.multi().client(['list']).exec(function(err, results) {
var pairs = results[0].split(' ');
pairs.forEach(function(pair){
var kv = pair.split('=');
if (kv[0] == 'name' && kv[1] == 'some-name-looking-for')
found = true;
});
if (found) {
// some logic
}
});
我必须实现一项功能,如果登录用户数超过允许的用户数,则不应允许更多用户登录。有没有办法获取 running/existing 会话的列表?以及如何销毁特定会话?谁能提供一个例子,因为我是 node.js 的新手。我的部分代码是:
express = require('express'),
session = require('express-session'),
RedisStore = require('connect-redis')(session),
bodyParser = require('body-parser');
redisOpts = {
pass: config.REDIS_PASS,
host: config.REDIS_SERVER || null,
port: config.REDIS_PORT || null
},
sessionStore = new RedisStore(redisOpts),
app = express();
app.use(session({
store: sessionStore,
secret: 'XXX',
resave: true,
saveUninitialized: true
}));
编辑
express = require('express'),
session = require('express-session'),
redis = require("redis"),
RedisStore = require('connect-redis')(session),
bodyParser = require('body-parser');
redisOpts = {
pass: config.REDIS_PASS,
host: config.REDIS_SERVER || null,
port: config.REDIS_PORT || null
},
redisClient = redis.createClient(redisOpts.port, redisOpts.host, { auth_pass: redisOpts.pass }),
sessionStore = new RedisStore(redisClient),
app = express();
app.use(session({
store: sessionStore,
secret: 'XXX',
resave: true,
saveUninitialized: true
}));
并且在 app.js 内部登录函数中,如果检查会话列表:
redisClient.keys("sess:*", function(error, keys){
console.log("Number of active sessions: ", keys.length);
console.log(keys);
});
此编辑后,它在 connect-redis.js 的这一行中抛出错误:
TypeError: this.client.unref is not a function
if (options.unref) this.client.unref();
感谢任何帮助。
非常感谢。
不过您需要直接查询 redis 集合。
由于 connect-redis 在内部使用 redis.createClient()
,您可以传递 redis 客户端实例而不是凭据。类似于:
//I've kept your redisOpts for clarity
redisOpts = {
pass: config.REDIS_PASS,
host: config.REDIS_SERVER || null,
port: config.REDIS_PORT || null
},
var redisClient = redis.createClient(redisOpts.port, redisOpts.host, { auth_pass: redisOpts.pass });
现在,像以前一样配置您的 redis 存储,但传入 redisClient
sessionStore = new RedisStore(redisClient)
您现在可以使用相同的 redisClient
来查询会话密钥的数量
redisClient.keys("sess:*", function(error, keys){
console.log("Number of active sessions: ", keys.length);
});
我通常为每个会话设置一个名称,例如:
var redis_client = redis.createClient();
redis_client.client('setname', 'tour-client');
然后当我想检查它时:
redis_client.multi().client(['list']).exec(function(err, results) {
var pairs = results[0].split(' ');
pairs.forEach(function(pair){
var kv = pair.split('=');
if (kv[0] == 'name' && kv[1] == 'some-name-looking-for')
found = true;
});
if (found) {
// some logic
}
});