如何实现分布式系统下websocket的session问题

在分布式系统下,使用 Redis 可以实现 WebSocket 的 session 共享,确保多个服务器之间能够共用 session 数据。具体实现步骤如下:

在建立 WebSocket 连接时,生成一个唯一的 session ID,并将该 session ID 与用户标识(如用户ID)关联起来。

将 session ID 和相关数据(如用户信息、权限等)存储在 Redis 中,可以将 session ID 作为 key,相关数据作为 value 存储在 Redis 的 hash 结构中。

每当需要访问 session 数据时,通过 session ID 在 Redis 中检索相应的数据。

定时更新 session 数据的过期时间,以确保不活跃的 session 数据会被清理,防止数据持续增长导致内存溢出。

当用户断开 WebSocket 连接时,及时清理对应的 session 数据,释放资源。

在代码中,可以通过 RedisTemplate 工具类来访问 Redis 数据库。例如,在 onOpen 方法中,可以将 session ID 和用户信息存入 Redis:

// 获取用户信息
Map<String, Object> userProperties = conf.getUserProperties();
String erp = (String) userProperties.get("erp");

// 将 session ID 和用户信息存入 Redis
String sessionId = session.getId();
redisTemplate.opsForHash().put(sessionId, "erp", erp);
redisTemplate.expire(sessionId, 30, TimeUnit.MINUTES);
在 onClose 方法中,可以从 Redis 中删除对应的 session 数据:

// 删除对应的 session 数据
redisTemplate.delete(session.getId());
在 sendMessage 方法中,可以从 Redis 中获取对应的 session 数据:

// 从 Redis 中获取对应的 session 数据
String erp = (String) redisTemplate.opsForHash().get(session.getId(), "erp");
这样,在分布式系统下,多个服务器可以共同访问 Redis 中的 session 数据,实现 WebSocket 的 session 共享。

https://mp.weixin.qq.com/s/FrI_5swDTBntwrqNE-56cQ
https://mp.weixin.qq.com/s/M7ZHyavibBPHB5JksnKdAQ

https://gitee.com/summer-studio/export-excel

本文作者:晚点心动。

本文链接:https://www.cnblogs.com/lucky-tao/p/18024309

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   晚点心动。  阅读(742)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开
  1. 1 小星星 七喜
  2. 2 情深深雨濛濛 杨胖雨
  3. 3 山水之间 许嵩
  4. 4 不潮不用花钱 御小兮
  5. 5 Rage Your Dream m.o.v.e
  6. 6 Disconnected Pegboard Nerds
  7. 7 STAY The Kid LAROI,Justin Bieber
  8. 8 Sunburst Tobu,Itro
  9. 9 迪士尼在逃公主 徐秉龙
  10. 10 赴约 赵乃吉
  11. 11 Tell Me 潘玮柏,徐洁儿
  12. 12 潮汐(抖音DJ版) 涛少君
  13. 13 我只能爱你 彭青
  14. 14 喜欢你 火鸡
  15. 15 失忆 郑十一(郑毅),蔡鹤峰
  16. 16 写不完的温柔 G.E.M.邓紫棋
  17. 17 忽而今夏 就是南方凯阿
  18. 18 老男孩 仲夏夜
  19. 19 2002 J.Fla
  20. 20 ✘ 按 下 暫 停 你 將 變 的 清 醒 且 墮 落 Mei
情深深雨濛濛 - 杨胖雨
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.