V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
YakuMioto
V2EX  ›  问与答

请教一个数据结构设计问题!

  •  
  •   YakuMioto · 2020-08-02 23:21:52 +08:00 · 1570 次点击
    这是一个创建于 1572 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一批随着时间不断增加的数据

    多个程序获取这批数据, 每次获取 n 个, 每个程序都能拿到所有的数据, 但是不能重复获取.

    例如: 数据 [1, 2, 3, 4, 5]

    第一次: 程序 A [1, 2], 程序 B [1]

    第二次: 程序 A [3, 4], 程序 B [2, 3, 4, 5]

    这个结构该如何设计呢?

    5 条回复    2020-08-03 18:46:55 +08:00
    weixuan
        1
    weixuan  
       2020-08-03 00:06:47 +08:00   ❤️ 1
    正好最近在看 Redis 相关的书籍,可以参考一下 Redis 的 Stream 部分如何实现的,不断增加数据 [1, 2, 3, 4, 5] 就是消息链表,程序 A 程序 B 对应不同的消费组,每个消费组会有个游标 last_delivered_id 在 Stream 数组(消息链表)之上往前移动,表示当前消费组已经消费到哪条消息了。或者参考一下 Kafka 的实现(据说 Redis 的 Stream 借鉴了 Kafka 的设计,对 Kafka 不熟悉,未验证,有错勿怪)
    luvcrashbot
        2
    luvcrashbot  
       2020-08-03 01:11:08 +08:00 via iPhone
    链表,每个链表关联一个订阅表,订阅表里存的所有订阅者 offset 都大于某个 item 则去掉这个元素。
    opengps
        3
    opengps  
       2020-08-03 08:34:05 +08:00
    好奇问一下:多个程序获取这批数据, 每次获取 n 个, 每个程序都能拿到所有的数据, 但是不能重复获取.
    这是个什么样的需求场景呢?我理解这种需求应该从程序层面做过滤(比如组合 id,id 然后 hash 去重),而不是靠取值时候修改返回量
    arvinsilm
        4
    arvinsilm  
       2020-08-03 12:09:08 +08:00
    消息队列分组订阅
    YakuMioto
        5
    YakuMioto  
    OP
       2020-08-03 18:46:55 +08:00
    @weixuan @arvinsilm 确实可行~
    @luvcrashbot 第一版就是这么实现, 想找个更简单的方法.
    @opengps 想做个代理池, 代理池就有这种需求. 哈哈哈

    感谢各位出谋划策, 想做的是个简易的代理池, 所以还涉及到 ip 可用性的校验以及丢弃, 基于 kafka 或者 redis 可能会变得更复杂.. 所以打算基于 map 实现了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 12:46 · PVG 20:46 · LAX 04:46 · JFK 07:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.