Skip to content

Commit f7d5575

Browse files
author
caiyu
committed
Fix ZAdd to keep the last score for duplicate members in a single command
1 parent 1db2fbd commit f7d5575

2 files changed

Lines changed: 27 additions & 3 deletions

File tree

src/pika_zset.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,13 @@ void ZAddCmd::DoThroughDB() {
5353
void ZAddCmd::DoUpdateCache() {
5454
if (s_.ok()) {
5555
std::string CachePrefixKeyZ = PCacheKeyPrefixZ + key_;
56-
STAGE_TIMER_GUARD(cache_duration_ms, true);
57-
db_->cache()->ZAddIfKeyExist(CachePrefixKeyZ, score_members);
56+
if (db_->cache()->Exists(CachePrefixKeyZ)) {
57+
STAGE_TIMER_GUARD(cache_duration_ms, true);
58+
db_->cache()->ZAddIfKeyExist(CachePrefixKeyZ, score_members);
59+
} else {
60+
STAGE_TIMER_GUARD(cache_duration_ms, true);
61+
db_->cache()->ZAdd(CachePrefixKeyZ, score_members);
62+
}
5863
}
5964
}
6065

tests/integration/zset_test.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,26 @@ var _ = Describe("Zset Commands", func() {
233233
Member: "two",
234234
}}))
235235
})
236-
236+
// Caiyu's test: verify that zadd with multiple scores for the same member in
237+
//a single command only keeps the last score, consistent with Redis behavior
238+
It("should ZAdd with duplicate member in one command", func() {
239+
added, err := client.ZAdd(ctx, "myzset", redis.Z{
240+
Score: 100,
241+
Member: "one",
242+
}, redis.Z{
243+
Score: 98,
244+
Member: "one",
245+
}).Result()
246+
Expect(err).NotTo(HaveOccurred())
247+
Expect(added).To(Equal(int64(1)))
248+
249+
vals, err := client.ZRangeWithScores(ctx, "myzset", 0, -1).Result()
250+
Expect(err).NotTo(HaveOccurred())
251+
Expect(vals).To(Equal([]redis.Z{{
252+
Score: 98,
253+
Member: "one",
254+
}}))
255+
})
237256
It("should ZAdd bytes", func() {
238257
added, err := client.ZAdd(ctx, "zset", redis.Z{
239258
Score: 1,

0 commit comments

Comments
 (0)