V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2018-11-07 10:17:40 +08:00 · 2675 次点击
    这是一个创建于 2215 天前的主题,其中的信息可能已经有所发展或是发生改变。

    业务描述

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

    我原本的想法

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

    弊端

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

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

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

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

    你这个 redis 没学好啊 redis 支持那么多种用法跟结构啊
    Outliver0
        12
    Outliver0  
       2018-11-07 10:44:29 +08:00
    epoll
    lanqing
        13
    lanqing  
    OP
       2018-11-07 10:45:59 +08:00
    @lauix 感谢,对,可以理解是 client 主动拉取,但是不还是需要 client 主动过来建立链接,然后才能发送过去吗= =
    lanqing
        14
    lanqing  
    OP
       2018-11-07 10:48:50 +08:00
    @ipoh 可以,我愚笨了,感谢!
    lauix
        15
    lauix  
       2018-11-07 10:51:38 +08:00
    @lanqing 打错字了,是开源。
    client 当然要连接 server 端了,但是 client 只接收消息,server 端 有数据的时候,主动发送到 client。
    和其他人说的 发布订阅一个道理 。可以自己写,可以采用其他开源的项目。
    lanqing
        16
    lanqing  
    OP
       2018-11-07 10:52:41 +08:00
    @lauix 好的,谢谢
    lanqing
        17
    lanqing  
    OP
       2018-11-07 11:01:47 +08:00
    @richzhu 如果没有就是要循环去查了哦= =,
    knightlhs
        18
    knightlhs  
       2018-11-07 11:45:06 +08:00
    @lanqing redis 如果需要循环查找的话一定是你的使用方式哪里错了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2870 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:32 · PVG 14:32 · LAX 22:32 · JFK 01:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.