我在调查飞机。我们需要使用它作为数据缓存(不需要持续),因为这些数据只存在很短的时间。(我们创建它,阅读它,然后我们的目标是尝试根据服务上的某些处理尽可能快地删除它)
我们的数据如下所示:
Record :
- RecordId
- ClientId
- Partition
- Region
- Size
- May have X number of custom attributes (I will probably limit the number of the attributes)这里的ClientId表示我们希望实现的多租户。我们将始终只查询属于一个特定ClientId的记录。
我们需要在不同的字段上查询这些数据。我知道,这对于Aerospike来说并不容易,因为它只支持每个查询的辅助索引上的一个过滤器。由于我们需要支持重要数量的记录(可能在几百万的范围内),所以我们希望根据它们的分区字段对记录进行分区。这应该允许查询运行得更快,并使后置处理更容易。
通过分区,每个记录都有相同的格式,但不同分区之间的格式可能不同。
为了解决这个问题,我想用下列方式对我的数据进行建模:
成套:
Partition_{ClientId} : (string equality filter)
Key : RecordId
Bin : Partition
Index : Partition
Region_{ClientId} (string equality filter)
Key : RecordId
Bin : Region
Index : Region
Size_{ClientId} (integer range search)
Key : RecordId
Bin : Size
Index : Size为过滤我的数据所必需的集合。然后,我们将查询不同的集合,并实现查询结果的交集,以获得过滤的查询。
第一个问题,我是这样做的,因为根据我所读到的,没有一种容易的方法来过滤基于几个过滤器的集合。这是正确的假设吗?
第二个问题,基于该模型,我们将以更快的速度达到一个名称空间中set的极限。还有其他方法可以在仍然有效的情况下对同一类型的数据进行建模吗?
发布于 2020-10-29 18:38:18
您可以拥有最大1023套并定义最大256个辅助索引。如果分区数量有限(低于1023),则将其用作辅助索引。SIs内置于进程RAM中,为您的查询提供了更快的第一批合格记录的优势。然后使用ClientID上的表达式进行筛选,不管其他条件如何。在您的情况下,记录具有元数据-过期时间(TTL),或者可能是记录的LastUpdateTime (或其中任何一个)--如果您首先可以对元数据进行筛选,这可以给出一个确定的GO/NOGO元数据--元数据在RAM (假设Community )中,所以这是快速的--它将保存从磁盘中读取记录以进行其他与bin值相关的筛选。Bin数据在磁盘上-假设您使用的是存储引擎设备。如果这是一个缓存,并且您正在使用存储引擎内存,那么bin数据检索也会更快。
因此,您可以执行如下查询:对于PartitionId==220,给我ClientID=3005剩余寿命(TTL)大于3600秒以及Region=="North“和Size>300的所有记录。也就是说,您可以在记录元数据和/或bin值或bin值上构建计算为true或false的任何逻辑组合。对于这个示例查询,您只需要在PartitionId上使用SI。
https://stackoverflow.com/questions/64591949
复制相似问题