Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 计算Redis中索引(zset)之间关联的元素数_Optimization_Redis_Statistics_Counting_Approximation - Fatal编程技术网

Optimization 计算Redis中索引(zset)之间关联的元素数

Optimization 计算Redis中索引(zset)之间关联的元素数,optimization,redis,statistics,counting,approximation,Optimization,Redis,Statistics,Counting,Approximation,我在Redis中有许多索引,它们存储与其时间戳相关联的键名(它是一个zset)。假设我有5个索引: 苹果->1,2,3 红色->1,2 绿色->3 大->3,2 小->1 我想知道有多少红苹果是大的(如果有必要的话,我可以接受一点误差)第一种方法是将苹果和红索引相交,然后搜索1和2的大索引,但这是大索引所需要的资源,如果我想知道许多其他索引的这一点,想象一下我有100个包含1000个键的索引,就速度而言是不可能的 第二种方法是为每个索引存储一个索引“链”,例如,当我添加一个新的键时,我可以访

我在Redis中有许多索引,它们存储与其时间戳相关联的键名(它是一个zset)。假设我有5个索引:

  • 苹果->1,2,3
  • 红色->1,2
  • 绿色->3
  • 大->3,2
  • 小->1
我想知道有多少红苹果是大的(如果有必要的话,我可以接受一点误差)第一种方法是将苹果和红索引相交,然后搜索1和2的大索引,但这是大索引所需要的资源,如果我想知道许多其他索引的这一点,想象一下我有100个包含1000个键的索引,就速度而言是不可能的

第二种方法是为每个索引存储一个索引“链”,例如,当我添加一个新的键时,我可以访问我的键特征,因此我知道它是一个红色的小苹果,当我在苹果中添加它时,我将此信息存储在苹果中:链={small->1,red->1},然后当我有其他键时,要么我增加现有的关键点,要么我创建一个新的关键点,但当我想知道有多少个红苹果是大的,我的链不再工作,因为我没有能力相交链,或者我必须相交苹果和红,然后做一个相交链,但它的速度比第一种方法更差

第三种方法似乎是对结果的近似,我怎样才能近似地知道有多少红苹果是大的,并且有一个合理的误差范围?我看到Redis有HyperLogLog我可以用它来做这个用途吗


最后,如果您看到另一种方法,请告诉我,即使我必须存储另一个数据结构或更改现有的数据结构,我也愿意接受所有建议

正确的答案需要有关您的数据的更多信息-zset的数量和它们索引的键的数量

在RAM和CPU方面,一个可能更有效的索引是每个zset一个位图。每个键使用一位表示归属,并调用在所有键之间执行逻辑and(相交)

或者,您可能想看看作为Redis模块构建的“极速”搜索引擎,它支持这种(以及更多)类型的搜索