求教,使用SQLServer在Nodejs多进程环境下如何统计时时在线人数?
求教,使用SQLServer在Nodejs多进程环境下如何统计时时在线人数?
有哪位高人指点一下:(使用express,已经成功链接SQLserver数据库) 一、使用SQLserver保存Session以及原理 二、多进程下共享Session 三、当前用户是否在线
要实现使用 SQL Server 在 Node.js 多进程环境下统计实时在线人数,我们需要解决几个关键问题:
- 使用 SQL Server 保存 Session:
- 使用
express-session
和connect-mssql
这样的中间件来将 session 存储到 SQL Server 中。
- 使用
- 多进程下共享 Session:
- 由于多个 Node.js 进程需要共享同一个 session 数据库,确保它们能访问相同的 SQL Server 数据库。
- 判断当前用户是否在线:
- 定期更新用户的在线状态,并查询在线用户列表。
示例代码
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里面操作;定时并且在结束前再保存回数据库。
如果这样的话,直接本地存个文本都可以,哈哈哈
有个qq没,想问一下你怎么连接sqlserver的?我本机msnodesql始终无法连接成功啊
要在Node.js中使用SQL Server来统计实时在线人数,并且处理多进程环境下的Session共享问题,你可以通过以下步骤实现:
-
使用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);
-
多进程下共享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 }));
-
当前用户是否在线 可以通过定时更新用户的最后活动时间来判断用户是否在线。每次用户请求时,更新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分钟执行一次
以上是基本思路和代码示例,根据实际需求进行调整。