合并和求和redis有序集

2024-03-29 05:34:44 发布

您现在位置:Python中文网/ 问答频道 /正文

由于使用pythondict处理大量数据的性能较差,我设法迁移到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实现的是:

^{pr2}$

how to keep the structure of the dictionary

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

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

但是redis不支持list-in-list,所以我必须找到一个不同的解决方案。在


Tags: the数据textredis元素列表doc1result
1条回答
网友
1楼 · 发布于 2024-03-29 05:34:44

如果值是唯一的,可以使用redissorted 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中存在的元素而不是{}中的元素则比较困难,因为redis中没有{}。根据您的数据(以及两个集合中存在的元素的分数),您可以这样做(假设所有的分数(您称之为“值”)都为正,并且两个集合中相互元素的分数相同):

^{pr2}$

相关问题 更多 >