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

2020-08-02 23:21:52 +08:00
 YakuMioto

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

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

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

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

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

这个结构该如何设计呢?

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

感谢各位出谋划策, 想做的是个简易的代理池, 所以还涉及到 ip 可用性的校验以及丢弃, 基于 kafka 或者 redis 可能会变得更复杂.. 所以打算基于 map 实现了.

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

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

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

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

© 2021 V2EX