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
Redis:存储中间集合结果、使用随机名称还是在事务中换行?_Redis_Sortedset - Fatal编程技术网

Redis:存储中间集合结果、使用随机名称还是在事务中换行?

Redis:存储中间集合结果、使用随机名称还是在事务中换行?,redis,sortedset,Redis,Sortedset,我必须得到一个基于(排序)集的多个并集的交集的结果 例如 显而易见的方法是将并集(A,B)和并集(C,D)存储在临时集合中,并在最终的交叉点命令中使用这些集合 但显然,这些临时集合需要一个名称,尽管Redis是单线程的,但如果我使用固定名称,我将遇到并发问题 我的解决方案是在MULTI/EXEC块中执行整个“查询”(创建临时集、执行交集、获取结果、删除临时键) 明显的替代方法是不使用MULTI/EXEC,而是为这些临时集使用足够随机的名称 我的问题是:哪种做法更可取/最佳 前者可能会带来性能(对

我必须得到一个基于(排序)集的多个并集的交集的结果

例如

显而易见的方法是将并集(A,B)和并集(C,D)存储在临时集合中,并在最终的交叉点命令中使用这些集合

但显然,这些临时集合需要一个名称,尽管Redis是单线程的,但如果我使用固定名称,我将遇到并发问题

我的解决方案是在MULTI/EXEC块中执行整个“查询”(创建临时集、执行交集、获取结果、删除临时键)

明显的替代方法是不使用MULTI/EXEC,而是为这些临时集使用足够随机的名称

我的问题是:哪种做法更可取/最佳

前者可能会带来性能(对其他线程的可用性)损失,但后者会增加复杂性,并且不能保证不会导致并发问题


我还没有在Lua中仔细研究过,但我认为这会使它变得更加复杂。

我不会删除事务中的密钥。删除一个键是O(n),请参阅其他选项。我认为通常情况下,解决方案确实取决于具体情况,是否有特定的原因使您不能保留一个Union\u a\u B和Union\u C\u D,或者甚至总是让它们进行计算?嗯,这是对内存的权衡。这里有很多可能的排列。保存所有可能的联合集将消耗大量内存,以加快当前不是瓶颈的速度。但您暗示将它们保留会导致并发问题,您能否举例说明这可能会出现问题?您选项的一个调整是创建临时集(guid名称等),并在创建后立即,在上面加上一个过期标记,以防失败/崩溃。您还可以创建名为temp:的临时集,因此在启动时,删除temp:*。它甚至在创建之后但在设置过期之前捕获崩溃
Intersect(Union(A,B), Union(C,D), E)