redis 怎么实现存储 websocket 对象

2023-01-05 23:41:03 +08:00
 leeguo

突然想起以前做个一个 IM 的项目(项目已经结束很久了), 使用的 websocket(Django+Channels),但链接对象是存在 redis 里的 不过现在想来 底层都是 TCP , 怎么把 TCP 链接状态存到 redis 里的呢? 存的 TCP 五元组么?有点蒙蔽, 也没去看源码, 有老哥了解过的, 大致的讲解一下么。

2437 次点击
所在节点    程序员
12 条回复
IvanLi127
2023-01-06 00:19:02 +08:00
好奇这存下来能干啥。。。socket 对象序列化后存都是能存得了,就是这存下来有啥用?链接没了有 socket 对象好像也干不了什么?
ruxuan1306
2023-01-06 01:20:17 +08:00
是不能,只能说你自己抽象一个应用层的 sessionID 。

比如王者荣耀这种,你 4G 切 WiFi 时候,实际传输层链接已经变了,但你卡一下后,照样接着玩。
Jooooooooo
2023-01-06 01:47:22 +08:00
感觉提的是 A/B 问题

你想要的是想存 session?
Trim21
2023-01-06 02:20:57 +08:00
你描述的这个例子里 redis 存的应该是 session ,TCP 是没法存到 redis 里面的。
hanxiV2EX
2023-01-06 02:40:29 +08:00
存 sessionid 和待发送成功的数据包
jaggle
2023-01-06 08:24:25 +08:00
你的 websocket 是 socketio 这种用 http 链接的吧?是的话还有能存 redis
wenqiang1208
2023-01-06 09:21:59 +08:00
之前看过群聊 group 的实现
channels_redis 一层 存储的是 group (房间) + 每个房间的人(链接,每个链接分配的唯一字符串), 以及还会存储一下转发的消息(消息有过期时间) ps:channels_redis 大版本升级,存储方式 会变化。
awalkingman
2023-01-06 09:43:01 +08:00
不是很清楚你的存储 websocket 对象是指什么,但是一个客户端 M 和服务器 A 建立了 websocket 连接,是没办法通过某种共享介质让服务器 B 给客户端 M 发消息的,除非服务器 B 也和客户端 M 建立了 websocket 连接。redis 能存就是 [客户端 M 和服务器 A 建立了 websocket 连接] 这个信息。
rev1si0n
2023-01-06 11:38:16 +08:00
你认为虚拟机里创建 100 个 TCP 连接到百度,拍摄快照后再恢复,那 100 个连接还是那 100 个连接嘛?
jack778
2023-01-06 12:53:12 +08:00
我也尝试过,不要这样弄,你服务器重启了 scoket 链接也失效了,所以用应用内缓存就可以了
kaneg
2023-01-06 14:18:34 +08:00
websocket 和普通的 socket 没有两样,都是网络层,这一类资源是不能持久化的,或者说持久化是没有意义的。
YangXin90
2023-01-06 17:08:46 +08:00
client 链接哪台就只能和它通信。可以参考 socket.io 支持分布式,可以通过 redis 传递消息。
https://socket.io/docs/v4/redis-adapter/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/906873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX