V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Boywus
V2EX  ›  算法

如何实现 [可变时间区间] 内的排序系统?

  •  
  •   Boywus · 2019-07-12 15:02:42 +08:00 · 2173 次点击
    这是一个创建于 1960 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在存在一个案例:

    现有一个插入线程不断的往数据库里里面插入数据:

    [ {"ts": 1562902203, "event": "product1", "direction": "buy", "price": 0.8}, {"ts": 1562902204, "event": "product1", "direction": "sell", "price": 0.8} ]

    现在存在 N 个查询线程在做查询操作,查询内容有:

    当前时间减去 X 时间内的最高价 当前时间减去 X 时间内的最低价 因为存在两个因素: 时间 和 价格 ,所以这两个都得加索引。 查询频率极高,

    假设 X 等于 5 分钟, 当前是 15:00:00,查询最高价 , 查询条件是 14:55:00 - 15:00:00 内的最高价,假设是 14:58:00 是最高价。 如果当前是 15:00:01 其他不变, 查询条件是 14:55:01 - 15:00:01 内的最高价,结果很可能仍然是 14:58:00 是最高价。

    这种情况下,就是纯粹浪费资源了,但是可能第一次查询的最高价是 14:55:00,第二次的最高价是 15:00:01,这种情况也是必须要考虑到的。

    现有的运行方案是:mysql 5.7 ts 和 price 都加索引。

    select * from data where ts >= '14:55:00' order by price desc limit 1

    麻烦就是麻烦在: 下次的查询,可能跟上次的结果是一样的,但是存在不一样的可能,为了这个可能不一样需要花费大量的资源来查询。

    一个不成熟的方案想法:

    Redis-Zset 方案: 按照价格排好一份,这样排序问题解决了,筛选变快了,但是不知道时间怎么做到可变。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5341 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:33 · PVG 16:33 · LAX 00:33 · JFK 03:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.