计算 connect-redis 中的会话数 [英] count number of sessions in connect-redis

查看:39
本文介绍了计算 connect-redis 中的会话数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用 connect-redis 进行会话时,我一直在努力计算用户或会话 ID 的数量.我提到了这个:http://expressjs.com/guide.html#users-online

I have been struggling to count the number of users or session ids, when using connect-redis for sessions. I've referred to this: 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 内部?

Obviously, the above code does not understand the variable db as there is no explicit redis.createClient(); ... Does connect-redis do the redis.createClient internally ?

请帮助了解如何使用 connect-redis 计算会话 ID 的数量.

Please help on how to count the number of session ids with connect-redis.

推荐答案

是的,connect-redis 确实会在内部使用 redis.createClient(),如果您只向它提供像上面那样的凭据.您也可以直接将其传递给客户端.

Yes, connect-redis does use redis.createClient() internally if you only provide it with credentials like you have above. You can also pass it a client directly.

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:".

To get the number of sessions you'll want to query redis for the set of keys matching that key prefix. For connect-redis this is "sess:".

redisClient.keys("sess:*", function(error, keys){
    console.log("Number of active sessions: ", keys.length);
});

正如他们在 redis 文档中所说的那样,keys 命令需要线性时间,因此在大型系统中频繁查询它不是一个好主意.您最好保留一个单独的计数器,当用户登录时增加该计数器,并在用户退出时减少该计数器.

As they state in the redis documentation, the keys command takes linear time so in large systems it's not a good idea to query this frequently. You'd be better off keeping a separate counter that you increment when a user signs in and decrement when a user signs out.

这篇关于计算 connect-redis 中的会话数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆