求教,使用SQLServer在Nodejs多进程环境下如何统计时时在线人数?

求教,使用SQLServer在Nodejs多进程环境下如何统计时时在线人数?

有哪位高人指点一下:(使用express,已经成功链接SQLserver数据库) 一、使用SQLserver保存Session以及原理 二、多进程下共享Session 三、当前用户是否在线

10 回复

要实现使用 SQL Server 在 Node.js 多进程环境下统计实时在线人数,我们需要解决几个关键问题:

  1. 使用 SQL Server 保存 Session
    • 使用 express-sessionconnect-mssql 这样的中间件来将 session 存储到 SQL Server 中。
  2. 多进程下共享 Session
    • 由于多个 Node.js 进程需要共享同一个 session 数据库,确保它们能访问相同的 SQL Server 数据库。
  3. 判断当前用户是否在线
    • 定期更新用户的在线状态,并查询在线用户列表。

示例代码

1. 安装必要的依赖

npm install express express-session connect-mssql mssql

2. 配置 Express 和 Session 中间件

const express = require('express');
const session = require('express-session');
const sql = require('mssql');

// 配置 SQL Server 连接字符串
const config = {
    user: 'yourUsername',
    password: 'yourPassword',
    server: 'yourServerName',
    database: 'yourDatabaseName'
};

const app = express();

app.use(session({
    secret: 'yourSecretKey',
    resave: false,
    saveUninitialized: true,
    store: new (require('connect-mssql')(session))(config),
    cookie: { maxAge: 60000 } // 设置 session 有效期为 60 秒
}));

// 中心化 session 存储
app.use((req, res, next) => {
    req.session.touch(); // 触发 session 更新
    next();
});

// 示例路由
app.get('/', (req, res) => {
    req.session.visits = (req.session.visits || 0) + 1;
    res.send(`Hello, you have visited this page ${req.session.visits} times.`);
});

// 获取在线用户数量
app.get('/online-users', async (req, res) => {
    try {
        await sql.connect(config);
        const result = await sql.query`SELECT COUNT(*) AS OnlineCount FROM sessions WHERE lastAccess > DATEADD(minute, -1, GETUTCDATE())`;
        res.json({ onlineUsers: result.recordset[0].OnlineCount });
    } catch (err) {
        console.error(err);
        res.status(500).send('Error retrieving online users.');
    }
});

app.listen(3000, () => {
    console.log('App is running on port 3000');
});

解释

  • Session 存储:使用 connect-mssql 将 session 数据存储在 SQL Server 中。配置中包含连接字符串和其他参数。
  • Session 更新:通过 req.session.touch() 方法定期更新 session 的最后访问时间,以保持 session 活跃。
  • 在线用户计数:通过 SQL 查询计算最近一分钟内有活动的 session 数量,从而得到在线用户数。

这种方法可以确保在多进程环境下所有进程都能正确读取和更新 session 数据,并且能够准确地统计在线用户数量。


有高人指点迷津吗?

你查询下SQLserver里面存session的表数据不就知道了吗

使用msnodesql查询数据库时查询总数24000条使用时间为:23.60秒。这了太慢了。有没有研究过?

存session 居然用RDMS数据库…话说,怎么不试一下用redis??

redis … 2w条数据,毫秒级查完…

出个损招,session丢掉不会导致麻烦后果的话,启动的时候,把旧session一次性读入到node,以后直接在node里面操作;定时并且在结束前再保存回数据库。

如果这样的话,直接本地存个文本都可以,哈哈哈

redis 存session,心跳包检查用户是否在线。

有个qq没,想问一下你怎么连接sqlserver的?我本机msnodesql始终无法连接成功啊

要在Node.js中使用SQL Server来统计实时在线人数,并且处理多进程环境下的Session共享问题,你可以通过以下步骤实现:

  1. 使用SQL Server保存Session 使用express-session中间件结合session Sql Server存储适配器来保存Session。这允许你在SQL Server中持久化Session数据。

    安装必要的包:

    npm install express express-session session-sqlserver
    

    示例代码:

    const express = require('express');
    const session = require('express-session');
    const sql = require('mssql');
    
    const app = express();
    
    const config = {
        server: 'your_server',
        database: 'your_database',
        user: 'your_user',
        password: 'your_password',
        options: {
            encrypt: true // for azure
        }
    };
    
    app.use(session({
        key: 'express.sid',
        store: new session.sqlStore({
            schema: 'dbo',
            tableName: 'Sessions',
            config: config
        }),
        secret: 'your_secret',
        resave: false,
        saveUninitialized: false
    }));
    
    app.get('/', (req, res) => {
        req.session.user = 'someUser'; // 假设用户登录了
        res.send('Logged in');
    });
    
    app.listen(3000);
    
  2. 多进程下共享Session 多进程环境下的Session共享可以通过Redis或共享存储解决方案来实现。这里假设使用Redis来共享Session。

    安装Redis客户端:

    npm install redis connect-redis
    

    示例代码:

    const RedisStore = require('connect-redis')(session);
    
    app.use(session({
        key: 'express.sid',
        store: new RedisStore({
            host: 'localhost',
            port: 6379,
            // 其他Redis配置选项
        }),
        secret: 'your_secret',
        resave: false,
        saveUninitialized: false
    }));
    
  3. 当前用户是否在线 可以通过定时更新用户的最后活动时间来判断用户是否在线。每次用户请求时,更新Session中的最后活动时间,然后定期检查该时间。

    示例代码:

    app.use((req, res, next) => {
        req.session.lastActive = Date.now();
        next();
    });
    
    setInterval(() => {
        // 查询最近5分钟内活跃的用户
        const threshold = Date.now() - 5 * 60 * 1000;
        const query = `SELECT * FROM Sessions WHERE lastActive > ${threshold}`;
        sql.connect(config).then(() => {
            new sql.Request().query(query)
                .then(result => {
                    console.log(`Online users:`, result.recordset.length);
                });
        });
    }, 5 * 60 * 1000); // 每5分钟执行一次
    

以上是基本思路和代码示例,根据实际需求进行调整。

回到顶部