gpt4 book ai didi

database - 我可以通过哪些方式设计 key 来提高 Redis 集的性能?

转载 作者:可可西里 更新时间:2023-11-01 11:13:28 26 4
gpt4 key购买 nike

我有一组由每个州键入的个人 ID

people/stateName:VA = {1,2,3,4,5,6} 
people/stateName:TX = {7,8,9,10,11}
...

我有一组属于公司 1 的个人的 ID

people/company:1 = {2,6,7,10}

在上面的例子中,如果我想找到所有属于公司 1 并且居住在 VA 和 TX 州的人,我会这样做:

SUNIONSTORE tempkey people/stateName:VA people/stateName:TX
SINTERSTORE tempkey tempkey people/company:1

在数学中:(A ∪ B) ∩ C

但是,在我的例子中,状态的数量是未知的,所以你必须遍历你想要的状态集的列表,将它们组合起来,然后最后将它与公司相交(你会如果您有多家公司,则必须重复该过程)

foreach( state in state_list ){
SUNIONSTORE(tempkey_state,tempkey_state, 'people/stateName:{state}')
}
foreach( companyNumber in company_list ){
SUNIONSTORE(tempkey_company, tempkey_company, 'people/company:{companyName}')
}

SINTERSTORE(resultkey, tempkey_state, tempkey_company);

在我的真实场景中,每个集合都非常大,有 10,000 到 1,000,000 名成员。但是这个过程可能很慢(在某些情况下比 SQL 慢)

据我了解,瓶颈是 SUNIONSTORE,因为它随着每次迭代而增长,并且 O(N) 的 O 很大

有什么方法可以更快地完成我想做的事情?我想到的一些解决方案

  • 为公司下的状态创建一个键空间,例如人/公司:1/州:VA 这将大大减少我的时间,但会显着增加我必须存储的 key 数量
  • 如果 redis 对于特定查询较慢,则回退到 SQL

你有什么想法?

最佳答案

集合代数包括交换律和分配律,因此:

(A ∪ B) ∩ C = (C ∩ A) ∪ (C ∩ B)

Redis 使用交换律来优化交集计算:它在应用其算法之前按大小对集合进行排序,以最大限度地减少操作次数。

此外,并集和交集运算的性能主要取决于对象创建的成本(涉及内存分配),而不是实际的并集/交集算法。

在你的例子中,我会说状态有大集合的概率高于公司有大集合的概率,所以我宁愿执行:

MULTI
SINTERSTORE tmp1 people/company:1 people/stateName:VA
SINTERSTORE tmp2 people/company:1 people/stateName:TX
SUNION tmp1 tmp2
DEL tmp1 tmp2
EXEC

在这里,在 Redis 命名空间中实际创建的唯一对象已经是交叉的结果,这可能会产生更少的对象。请注意,最后一个联合不会存储结果,而是直接将结果返回给客户端。

一定要使用管道来最大程度地减少网络往返次数。

如果你有几个公司,你可以在他们的集合之前应用一个联合(如果公司集合的平均大小不是太高),或者你可以每个公司重复这个模式几次(如果公司太大) ).

关于database - 我可以通过哪些方式设计 key 来提高 Redis 集的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31211926/

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