轮询方案

2025-07-26 09:57:46 阅读:4 编辑

方案: 前端做个轮询(60s) 考虑到可能为未登录情况下,user_id

后端

数据存储(redis)

  1. 存储心跳包 每当用户发送心跳包时,更新其在Sorted Set中的记录

https://chat.deepseek.com/a/chat/s/07c6e9ad-001a-4036-89d2-3d3390071ed8

const userId = "user123"; // 当前用户ID
const currentTimestamp = Date.now(); // 当前时间戳

// 使用Redis命令:ZADD online_users <timestamp> <user_id>
await redis.zadd('online_users', currentTimestamp, userId);

取消过期时间 + 定期清理

// 取消设置过期时间
// 改为使用定时任务清理离线用户
async function cleanupInactiveUsers() {
  const cutoff = Date.now() - 120000; // 2分钟不活跃视为离线
  await redis.zremrangebyscore('online_users', 0, cutoff);
}

// 每小时执行一次清理
setInterval(cleanupInactiveUsers, 3600000);