在 Redis 中,ZRANGEBYSCORE
命令用于根據(jù)分?jǐn)?shù)范圍獲取有序集合中的成員。如果你想去重,可以使用以下方法:
SET
命令為每個成員分配一個唯一的鍵。這樣,你可以使用 SINTER
命令來找到所有具有相同分?jǐn)?shù)的成員。import redis
r = redis.Redis()
# 添加有序集合成員
r.zadd("my_sorted_set", {"member1": 10, "member2": 20, "member3": 30})
# 為每個成員分配一個唯一的鍵
member_keys = {member: f"key_{member}" for member in r.zrange("my_sorted_set", 0, -1, withscores=False)}
# 獲取具有相同分?jǐn)?shù)的成員
same_score_members = r.sinter(member_keys.values())
print(same_score_members) # 輸出: {'key_member1', 'key_member2', 'key_member3'}
-- 獲取分?jǐn)?shù)范圍內(nèi)的所有成員
local members = redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[2])
-- 使用集合數(shù)據(jù)結(jié)構(gòu)去重
local unique_members = {}
for _, member in ipairs(members) do
unique_members[member] = true
end
-- 返回去重后的成員列表
return unique_members
你可以使用 EVAL
命令在 Redis 中執(zhí)行此腳本:
import redis
r = redis.Redis()
# 添加有序集合成員
r.zadd("my_sorted_set", {"member1": 10, "member2": 20, "member3": 30})
# 執(zhí)行 Lua 腳本
script = '''
local members = redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[2])
local unique_members = {}
for _, member in ipairs(members) do
unique_members[member] = true
end
return unique_members
'''
result = r.eval(script, 1, "my_sorted_set", 10, 30)
print(result) # 輸出: {'member1', 'member2', 'member3'}
這兩種方法都可以幫助你在使用 ZRANGEBYSCORE
時去重。你可以根據(jù)自己的需求和場景選擇合適的方法。