From 1694b38a92f2d5d8517989728ab565ad7e1979e9 Mon Sep 17 00:00:00 2001 From: guozhihao3 Date: Wed, 9 Apr 2025 19:56:02 +0800 Subject: [PATCH 1/2] fix: When there are multiple identical members in zadd command, only the rightmost member-score pair is written --- src/storage/src/redis_zsets.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) mode change 100644 => 100755 src/storage/src/redis_zsets.cc diff --git a/src/storage/src/redis_zsets.cc b/src/storage/src/redis_zsets.cc old mode 100644 new mode 100755 index f0cc013..4d1a19a --- a/src/storage/src/redis_zsets.cc +++ b/src/storage/src/redis_zsets.cc @@ -165,13 +165,13 @@ Status Redis::ZPopMin(const Slice& key, const int64_t count, std::vector& score_members, int32_t* ret) { *ret = 0; uint32_t statistic = 0; - std::unordered_set unique; + std::unordered_map ms_map; std::vector filtered_score_members; for (const auto& sm : score_members) { - if (unique.find(sm.member) == unique.end()) { - unique.insert(sm.member); - filtered_score_members.push_back(sm); - } + ms_map[sm.member] = sm.score; + } + for (auto& [member, score] : ms_map) { + filtered_score_members.emplace_back(score, std::move(member)); } char score_buf[8]; From d4e90a10276b6d10cfdcc3c3e523dd22c25b647c Mon Sep 17 00:00:00 2001 From: guozhihao3 Date: Sat, 19 Apr 2025 18:52:06 +0800 Subject: [PATCH 2/2] fix: use reverse order to reduce the number of for loops --- src/storage/src/redis_zsets.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/storage/src/redis_zsets.cc b/src/storage/src/redis_zsets.cc index 4d1a19a..a7e2532 100755 --- a/src/storage/src/redis_zsets.cc +++ b/src/storage/src/redis_zsets.cc @@ -167,11 +167,11 @@ Status Redis::ZAdd(const Slice& key, const std::vector& score_membe uint32_t statistic = 0; std::unordered_map ms_map; std::vector filtered_score_members; - for (const auto& sm : score_members) { - ms_map[sm.member] = sm.score; - } - for (auto& [member, score] : ms_map) { - filtered_score_members.emplace_back(score, std::move(member)); + for (auto it = score_members.rbegin(); it != score_members.rend(); ++it) { + auto& sm = *it; + if (ms_map.emplace(sm.member, sm.score).second) { + filtered_score_members.emplace_back(sm.score, sm.member); + } } char score_buf[8];