MFD*_*000 1 database-design relational-database nosql redis
所以为了设置这个,我有一个公司,我们有用户和一组标签来描述这些用户。每个用户最多可以附加 5000 个标签。
我们有一个引擎,允许客户选择某些标签来制作标签组。引擎具有 AND/Or 功能和 Include/Exclude。客户可以创建一个标签组,我们的引擎会找到满足标签组中指定的逻辑要求的用户总数。基本上这只是交集、联合和排除,所以 redis 集已经很完美了。
为了处理这个问题,我将数据存储为这样。Tag1:[user1, user2,user3] Tag2:[user1, user5, user6] 等等
从这里开始,所有 bool 逻辑都是使用脚本完成的。
然而,我们的客户群正在迅速扩大。几年之内,我们要么需要几个 64GB 的 redis 服务器,要么需要一个替代方案。
这是我的问题。是否有任何闪电般快速的数据库选项用于执行基于磁盘的交集和并集?我尝试过 Postgres,但性能不可接受。例如,对 500k 用户集的集比较需要 1 秒。在 Postgres 中,我看到大约 30 秒,如果标签组中有很多标签,时间会更长。
我已经推荐了 DynamoDB 和其他一些,但只是想在我深入挖掘之前获得一些受过教育的意见。
谢谢,丹
Redis 是获得快速交集和联合的最佳方式。你可以做一些事情来限制 Redis 使用的内存:
在内部,Redis 使用一种数据结构IntSets。这是一个排序的整数数组。要在这个集合中找到一个整数,复杂度是 O(log N)。IntSet 有三种风格 - 16 位、32 位和 64 位。
从内存的角度来看,Int Sets 是非常理想的。如果您使用集合并关心内存,则应确保使用 Int Sets。
要利用 Int Sets,您需要做两件事 -
set-max-intset-entries为合理的数字。这将是给定标签的最大用户数。请注意,将其增加到一个点以上实际上会降低性能。这些集合只需要用户 ID,它们不需要整个用户对象。因此,如果内存成为约束,您还可以将 User 对象移动到另一个数据存储。也许是另一个 Redis 服务器,甚至是关系数据库。这种方法为您提供了两全其美的方法。
| 归档时间: |
|
| 查看次数: |
1877 次 |
| 最近记录: |