在使用connect-redis进行会话时,我一直在努力计算用户数或会话ID数。我已经提到过:http://expressjs.com/guide.html#users-online
var express = require('express');
//var redis = require('redis');
//var db = redis.createClient();
var app = express();
var RedisStore = require('connect-redis')(express);
app.use(express.cookieParser());
app.use(express.session({
store: new RedisStore({
host: 'localhost',
port: 6379,
db: 2,
pass: 'RedisPASS'
}),
secret: '1234567890QWERTY'
}));
app.use(function(req, res, next){
var ua = req.headers['user-agent'];
db.zadd('online', Date.now(), ua, next);
});
app.use(function(req, res, next){
var min = 60 * 1000;
var ago = Date.now() - min;
db.zrevrangebyscore('online', '+inf', ago, function(err, users){
if (err) return next(err);
req.online = users;
next();
});
});
app.get('/', function(req, res) {
db.zadd('online', Date.now(), req.sessionID, next);
});
app.get('/', function(req, res){
res.send(req.online.length + ' users online');
});
app.listen(3000);
显然,上面的代码无法理解变量db
,因为没有明确的redis.createClient();
... connect-redis是否在内部执行redis.createClient
?
请帮助您了解如何使用connect-redis计算会话ID数量。
答案 0 :(得分:2)
是的,如果您只提供上面提供的凭据,则connect-redis会在内部使用redis.createClient()。您也可以直接将其传递给客户。
var redisClient = redis.createClient(6379, "127.0.0.1", { auth_pass: "RedisPASS" });
redisClient.select(2);
app.use(express.session({
store: new RedisStore({
client: redisClient
}),
secret: '1234567890QWERTY'
}));
要获取您要查询redis的会话数,以查找与该键前缀匹配的密钥集。对于connect-redis,这是“sess:”。
redisClient.keys("sess:*", function(error, keys){
console.log("Number of active sessions: ", keys.length);
});
正如他们在redis文档中所述,keys命令需要线性时间,所以在大型系统中,经常查询这个并不是一个好主意。你最好保留一个单独的计数器,当用户登录时你递增,当用户退出时递减。