【发布时间】:2017-08-09 20:13:34
【问题描述】:
我想创建一个分段引擎,但似乎无法找出用于该任务的最佳数据库或数据库结构。 目前我使用 MySQL 作为我的主数据库,但分段引擎是一个单独的软件组件,因此如果适用,可以有不同的数据库。
基本上,我有 1000 万个使用 UserID(整数)标识的唯一用户。分段引擎的管理员使用一些预定义的规则(如年龄范围、地理位置、交易历史等)动态创建分段。应用程序应该定期(每 15 分钟一次)执行每个段的规则,以获取属于该段的所有用户(每个最多 100 万个用户)的当前列表并存储它。
后来的应用程序公开了 API 以允许外部系统使用分段功能,即: 1. 获取特定 UserID 所属的所有段的列表。 2. 获取特定段包含的所有 UserID 的列表。
请注意,由于段需要非常频繁地更新(每 15 分钟一次),这会导致数据库中的大量事务来“维护”这些段,其中不适用的用户应该被删除并一直添加新用户。
到目前为止,我已经考虑了几种方法: 1. 普通的 MySQL,我有一个属于段的用户表(SegmentID,UserID)。 (这种方法有两个缺点:存储空间和 MySQL 中的不断删除/插入/更新,这将通过引入页面拆分降低 innodb 性能。
在 MySQL 中使用 JSON 数据类型,其中我可以有表 (UserID,Segments),其中段是包含 SegmentID 数组的 json。 (这里的缺点是搜索慢、更新慢)
将 Redis 与 Sets (UserID,Segments) 一起使用,其中 UserID 将是键,Segments 将是 SegmentID 的集合。 (这里的缺点是没有简单的方法来通过 SegmentID 进行搜索)。
有没有人从事过类似的任务并可以提供任何指导? 任何反馈都将不胜感激,因此我可以指出我可以进一步研究的方向。
【问题讨论】:
-
问题不清楚。我无法想象除了大量新用户进入数据库之外,用户群快速变化的情况。
-
假设有一部分用户在过去 24 小时(滚动期)内进行了 10 次交易。这部分会一直变化。另一个示例可能是在过去 24 小时(滚动期)内从移动设备登录 5 次的用户群。
标签: mysql database search redis nosql