V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lanqing
V2EX  ›  Python

一个简单的业务场景,不知如何实现

  •  
  •   lanqing · Nov 7, 2018 · 3311 views
    This topic created in 2741 days ago, the information mentioned may be changed or developed.

    业务描述

    • 有很多 client 与服务器 socket 通信
    • 有一个 redis 队列存了特定 client 需要的信息
    • client 发送请求连接给服务器,服务器在 redis 中找到这个 client 需要的信息(如果没有一直等待),找到后返回给这个 client,结束.

    我原本的想法

    • 服务器是 socketserver 多线程,当有个 client 来的时候,就循环在 redis 中找,一直到找到后再发送给 client

    弊端

    • 我想了下,如果我有 10000 个 client,会出现两个问题:
      • 10000 个 client 一直与我的服务器连接中(会不会服务器不支持这个多的连接同时存在)
      • 10000 个 client 每一个都要循环去 redis 中找数据 相同的操作重复了 10000 次,好蠢
      • 其实只要有一个循环一直查 redis,查到参数,就发给 client 与服务器连接的那个 socket 就可以(不知道如果实现这一步的想法)

    希望大佬能指点一二呀= =,

    18 replies    2018-11-07 11:45:06 +08:00
    gaius
        1
    gaius  
       Nov 7, 2018
    循环查 redis 是什么意思?
    lanqing
        2
    lanqing  
    OP
       Nov 7, 2018
    @gaius 因为 redis 中的数据是动态加入进去的,当那个 socket 没有查到他想要的数据的时候,就会过个两秒钟接着去 redis 中查数据,一直到查到为止
    xiaoxinshiwo
        3
    xiaoxinshiwo  
       Nov 7, 2018
    redis 不是有发布和订阅机制吗?
    再不然使用消息中间件,订阅 topic 然后监听接收消息啊
    changnet
        4
    changnet  
       Nov 7, 2018 via Android
    redis 是 kv 结构,为啥是循环查找而不是按 key 取
    10000 个 socket 连接是支持的

    说实在,不知道具体业务。不知道 client 是面对用户还是内部接口,不知道请求频率,不知道数据结构,这种问题发出来也没什么人帮得了你
    newtype0092
        5
    newtype0092  
       Nov 7, 2018
    你只是想实现一个队列消息加服务端推送吧。。。
    ipoh
        6
    ipoh  
       Nov 7, 2018
    不用多线程的模型,用异步的方式
    服务器这边维护一个{clientID->socket 句柄}的哈希表
    然后启一个线程去循环查 redis 每个元素,元素的在上面哈希表中就用对应的 socket 句柄发送过去
    richzhu
        7
    richzhu  
       Nov 7, 2018
    0.0 客户端知道自己想要什么吧? 客户端想要的称之为 Key, 然后服务端可以根据 Key 去 redis 取? 取到的值叫 value ? 酱紫。。不需要循环吧?
    niubee1
        8
    niubee1  
       Nov 7, 2018
    我倒是很想知道什么样的人会设计 redis 用循环的方式读取数据, 莫不是来搞笑的
    lauix
        9
    lauix  
       Nov 7, 2018
    你这样是 client 主动拉取,为什么不主动推送。
    不想自己写,可以用现成的 比如 MQTT 协议,ZMQ , T-IO 等开业项目。
    lanqing
        10
    lanqing  
    OP
       Nov 7, 2018
    @xiaoxinshiwo 非常感谢,发布和订阅机制能帮助我
    knightlhs
        11
    knightlhs  
       Nov 7, 2018
    10000 个 cient 也不过是 10000 个 list 而已
    每个 client 去查找自己的 list 找到数据就返回 找不到就阻塞 直到 超时就好啊
    你只要根据数据不同 分发到不同的 list 去就可以了

    你这个 redis 没学好啊 redis 支持那么多种用法跟结构啊
    Outliver0
        12
    Outliver0  
       Nov 7, 2018
    epoll
    lanqing
        13
    lanqing  
    OP
       Nov 7, 2018
    @lauix 感谢,对,可以理解是 client 主动拉取,但是不还是需要 client 主动过来建立链接,然后才能发送过去吗= =
    lanqing
        14
    lanqing  
    OP
       Nov 7, 2018
    @ipoh 可以,我愚笨了,感谢!
    lauix
        15
    lauix  
       Nov 7, 2018
    @lanqing 打错字了,是开源。
    client 当然要连接 server 端了,但是 client 只接收消息,server 端 有数据的时候,主动发送到 client。
    和其他人说的 发布订阅一个道理 。可以自己写,可以采用其他开源的项目。
    lanqing
        16
    lanqing  
    OP
       Nov 7, 2018
    @lauix 好的,谢谢
    lanqing
        17
    lanqing  
    OP
       Nov 7, 2018
    @richzhu 如果没有就是要循环去查了哦= =,
    knightlhs
        18
    knightlhs  
       Nov 7, 2018
    @lanqing redis 如果需要循环查找的话一定是你的使用方式哪里错了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   841 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 21:15 · PVG 05:15 · LAX 14:15 · JFK 17:15
    ♥ Do have faith in what you're doing.