V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
leeguo
V2EX  ›  程序员

redis 怎么实现存储 websocket 对象

  •  
  •   leeguo · 2023-01-05 23:41:03 +08:00 · 2710 次点击
    这是一个创建于 717 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    你想要的是想存 session?
    Trim21
        4
    Trim21  
       2023-01-06 02:20:57 +08:00 via Android   ❤️ 1
    你描述的这个例子里 redis 存的应该是 session ,TCP 是没法存到 redis 里面的。
    hanxiV2EX
        5
    hanxiV2EX  
       2023-01-06 02:40:29 +08:00 via Android   ❤️ 1
    存 sessionid 和待发送成功的数据包
    jaggle
        6
    jaggle  
       2023-01-06 08:24:25 +08:00 via iPhone   ❤️ 1
    你的 websocket 是 socketio 这种用 http 链接的吧?是的话还有能存 redis
    wenqiang1208
        7
    wenqiang1208  
       2023-01-06 09:21:59 +08:00   ❤️ 1
    之前看过群聊 group 的实现
    channels_redis 一层 存储的是 group (房间) + 每个房间的人(链接,每个链接分配的唯一字符串), 以及还会存储一下转发的消息(消息有过期时间) ps:channels_redis 大版本升级,存储方式 会变化。
    awalkingman
        8
    awalkingman  
       2023-01-06 09:43:01 +08:00   ❤️ 2
    不是很清楚你的存储 websocket 对象是指什么,但是一个客户端 M 和服务器 A 建立了 websocket 连接,是没办法通过某种共享介质让服务器 B 给客户端 M 发消息的,除非服务器 B 也和客户端 M 建立了 websocket 连接。redis 能存就是 [客户端 M 和服务器 A 建立了 websocket 连接] 这个信息。
    rev1si0n
        9
    rev1si0n  
       2023-01-06 11:38:16 +08:00   ❤️ 1
    你认为虚拟机里创建 100 个 TCP 连接到百度,拍摄快照后再恢复,那 100 个连接还是那 100 个连接嘛?
    jack778
        10
    jack778  
       2023-01-06 12:53:12 +08:00   ❤️ 1
    我也尝试过,不要这样弄,你服务器重启了 scoket 链接也失效了,所以用应用内缓存就可以了
    kaneg
        11
    kaneg  
       2023-01-06 14:18:34 +08:00   ❤️ 1
    websocket 和普通的 socket 没有两样,都是网络层,这一类资源是不能持久化的,或者说持久化是没有意义的。
    YangXin90
        12
    YangXin90  
       2023-01-06 17:08:46 +08:00   ❤️ 1
    client 链接哪台就只能和它通信。可以参考 socket.io 支持分布式,可以通过 redis 传递消息。
    https://socket.io/docs/v4/redis-adapter/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1284 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:23 · PVG 01:23 · LAX 09:23 · JFK 12:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.