首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取连接-redis上现有会话的列表。

获取连接-redis上现有会话的列表。
EN

Stack Overflow用户
提问于 2015-11-24 09:44:01
回答 2查看 2.9K关注 0票数 2

我必须实现一个功能,如果登录的用户数量超过允许的用户数,那么就不应该允许更多的用户登录。是否有方法获取运行/现有会话的列表?以及如何摧毁特定的会话?谁能提供一个例子,因为我是新的节点。我的代码之一是:

代码语言:javascript
运行
复制
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
}));

编辑

代码语言:javascript
运行
复制
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内部的登录函数中,如果检查会话列表:

代码语言:javascript
运行
复制
redisClient.keys("sess:*", function(error, keys){
        console.log("Number of active sessions: ", keys.length);
        console.log(keys);
});

在此编辑之后,它会在该行的connec-redis.js中引发一个错误:

代码语言:javascript
运行
复制
 TypeError: this.client.unref is not a function
 if (options.unref) this.client.unref();

任何帮助都是非常感谢的。

在此之前,非常感谢您。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-24 09:59:30

不过,您需要直接查询redis集合。

因为connect在内部使用redis.createClient(),所以您可以传递redis客户端的一个实例,而不是凭据。类似于:

代码语言:javascript
运行
复制
//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

代码语言:javascript
运行
复制
sessionStore = new RedisStore(redisClient)

现在可以使用相同的redisClient查询会话键的数量。

代码语言:javascript
运行
复制
redisClient.keys("sess:*", function(error, keys){
    console.log("Number of active sessions: ", keys.length);
});
票数 3
EN

Stack Overflow用户

发布于 2015-11-24 10:24:49

我通常为每个会话设置一个名称,如:

代码语言:javascript
运行
复制
var redis_client = redis.createClient();
redis_client.client('setname', 'tour-client');

然后当我想检查的时候:

代码语言:javascript
运行
复制
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
  }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33890173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档