gpt4 book ai didi

database-design - Redis 集的替代品

转载 作者:IT王子 更新时间:2023-10-29 06:08:18 26 4
gpt4 key购买 nike

因此,为了进行设置,我有一家公司,其中有用户和一组用于描述这些用户的标签。每个用户最多可以附加 5000 个标签。

我们有一个引擎允许客户选择特定的标签来制作标签组。该引擎具有 AND/Or 功能和包含/排除功能。客户可以创建一个标签组,我们的引擎会找到满足标签组中指定的逻辑要求的用户总数。基本上这只是交集、联合和排除,所以 redis 集是完美的。

为了处理这个问题,我按原样存储数据。标记 1:[用户 1、用户 2、用户 3]标记 2:[用户 1、用户 5、用户 6]等等

从这里开始,所有的 bool 逻辑都是使用脚本完成的。

但是,我们的客户群正在迅速扩大。几年之内,我们要么需要几个 64GB 的 Redis 服务器,要么需要一个替代方案。

这是我的问题。是否有任何闪电般快速的数据库选项可用于执行基于磁盘的相交和并集?我试过 Postgres,但性能令人无法接受。例如,对 500k 用户集进行集比较需要 1 秒。在 Postgres 中,我看到大约 30 秒,如果标签组中有很多标签,时间会更长。

我已经推荐了 DynamoDB 和其他一些,但在我深入挖掘之前只是想得到一些有根据的意见。

谢谢,丹

最佳答案

Redis 是获得快速交叉和联合的最佳方式。您可以做一些事情来限制 Redis 使用的内存:

使用 IntSet

在内部,Redis 使用了一个数据结构IntSets。这是一个排序的整数数组。要在这个集合中找到一个整数,复杂度是 O(log N)。 IntSet 有三种类型——16 位、32 位和 64 位。

从内存的角度来看,Int Sets 是非常理想的。如果您正在使用集合并且关心内存,则应确保您使用的是 Int 集合。

要利用 Int Sets,您需要做两件事 -

  1. 确保集合包含整数。如果您的用户 ID 是字符串,您将不得不稍微更改逻辑以使其成为整数。
  2. 在 redis.conf 中,将设置 set-max-intset-entries 更新为合理的数字。这将是给定标签的最大用户数。请注意,将它增加到超过某个点实际上会降低性能。

将用户对象移动到另一个存储区

集合只需要用户 ID,不需要整个用户对象。因此,如果内存成为限制条件,您还可以将 User 对象移动到另一个数据存储。也许是另一个 Redis 服务器,甚至是关系数据库。这种方法可以让您两全其美。

关于database-design - Redis 集的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12292297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com