2

由于使用 python dict 处理大量数据的性能不佳,我设法迁移到 redis。所以我有以下内容:

"doc1" =>  ('989', 4.0), ('99', 4.0), ('990', 4.0), ('991', 4.0), ('992', 4.0), ('993', 4.0), ('994', 4.0), ('995', 4.0), ('996', 4.0), ('997', 4.0), ('998', 4.0), ('999', 4.0)

"doc2" =>  ('4', 4.0), ('21', 4.0), ('55', 4.0), ('991', 4.0), ('992', 4.0), ('993', 4.0), ('994', 4.0), ('995', 4.0), ('996', 4.0)

"result" => ('991', 8.0), ('992', 8.0), ('993', 8.0), ('994', 8.0), ('995', 8.0), ('996', 8.0), ('99', 4.0),('4', 4.0), ('21', 4.0), ('55', 4.0)

如您所见,我想通过使用 python 将两个 redis 列表合并为一个,如果 doc1 中存在 doc2 中的元素求和它们的值,如果 doc1 中的元素在 doc2 中不存在,则添加结果的要素。我之前使用 dict 的实现是:

result_array = {k: [db_array.get(k, result_array.get(k))[0],db_array.get(k, dv)[1] + result_array.get(k, dv)[1]] for k in set(db_array) | set(result_array)}

如何保持字典的结构

如您所见,此解决方案适用于:

{'991': [4.0, 's.text'], '21': [4.0, 't.text'], '990': [4.0, 'b.text']}

但是redis不支持列表中的列表,所以我必须找到不同的解决方案。

4

1 回答 1

2

如果值是唯一的,您可以使用 redis sorted set

zadd doc1 4.0 989
zadd doc1 4.0 991

zadd doc2 4.0 21
zadd doc2 4.0 991

zinterstore result 2 doc1 doc2
zrange result 0 -1 withscores
1) "991"
2) "8"

这将为您提供集合(存在于两个集合中的元素)与分数的交集,即每个集合中元素分数的总和。

获取存在doc1但不存在的元素doc2比较棘手,因为zdiffredis 中没有。根据您的数据(以及两组中存在的元素的分数),您可以这样做(假设所有分数(您所谓的“值”)都是正数,并且两组中相互元素的分数相同):

zunionstore only_in_doc1 2 doc1 doc2 weights 1 -1
zremrangebyscore only_in_doc1 -inf 0
zrange only_in_doc1 0 -1 withscores
1) "989"
2) "4"
于 2012-05-29T09:50:06.523 回答