我有一系列事件在系统中流动(例如披萨订购系统),我想通过时间计算每个事件的某些属性。例如,我可能想看看在过去的5分钟内有多少独特的人订购了意大利辣香肠披萨,或者John Doe在过去一周里订购了多少披萨。
由于事件数量非常多,所以我们使用类似Cassandra或HBase的东西来存储,因为即使计数也无法存储在内存中。此外,由于我们需要跟踪集合成员资格(为了计算订购特定类型披萨的独特人数,例如),它会变得更大。
我们可以存储订单列表,然后查询以进行计数,但这很慢。而且我们大多数时候不关心谁订购了意大利辣香肠披萨,只关心有多少独特的订单被制作,并且在给定的时间窗口内。
例如在Cassandra中存储此信息的最佳方法是什么,以便可以在某些时间间隔内检索该信息?
我最初尝试使用Redis +布隆过滤器,但是存储布隆过滤器位向量将需要事务以避免竞争条件,因此我使用了Redis集合。
然后我意识到整个东西太大了,不能仅仅存在于内存中,因此我决定切换到磁盘支持的存储。但是,与Redis不同,没有本地集合。
我查看了HyperLogLog之类的草图/流算法,但是得出的结论是要保存hyperloglog对象,我需要存储位数组(或pickle对象或其他任何内容)...这是否可以,如果是解决方案,则最佳实践是什么?
我曾经尝试过将每个事件单独保存并带有时间戳,然后按需查询和计数,但这很慢。如果有更好的方法,我正在寻找它。
由于事件数量非常多,所以我们使用类似Cassandra或HBase的东西来存储,因为即使计数也无法存储在内存中。此外,由于我们需要跟踪集合成员资格(为了计算订购特定类型披萨的独特人数,例如),它会变得更大。
我们可以存储订单列表,然后查询以进行计数,但这很慢。而且我们大多数时候不关心谁订购了意大利辣香肠披萨,只关心有多少独特的订单被制作,并且在给定的时间窗口内。
例如在Cassandra中存储此信息的最佳方法是什么,以便可以在某些时间间隔内检索该信息?
我最初尝试使用Redis +布隆过滤器,但是存储布隆过滤器位向量将需要事务以避免竞争条件,因此我使用了Redis集合。
然后我意识到整个东西太大了,不能仅仅存在于内存中,因此我决定切换到磁盘支持的存储。但是,与Redis不同,没有本地集合。
我查看了HyperLogLog之类的草图/流算法,但是得出的结论是要保存hyperloglog对象,我需要存储位数组(或pickle对象或其他任何内容)...这是否可以,如果是解决方案,则最佳实践是什么?
我曾经尝试过将每个事件单独保存并带有时间戳,然后按需查询和计数,但这很慢。如果有更好的方法,我正在寻找它。
示例请求:
- 在过去的10分钟内有多少独特的人订购了意大利辣香肠披萨
- 在过去30分钟内,某个名为John Doe的人订购了多少独特的意大利辣香肠披萨