Python中如何使用Redis进行高效去重,但电脑性能不足怎么办?
null
Python中如何使用Redis进行高效去重,但电脑性能不足怎么办?
18 回复
你提问像蔡徐坤
用内存换性能。电脑内存不够的话,可以试试用 bloomfilter,但Python里得装 pybloom-live 这类库,其实也挺吃内存的。
还有个更省内存的土办法,用Redis的 HyperLogLog。它用来做基数统计,就是判断某个东西有没有出现过,特别省地方,一个Key大概就12KB,误差率不到1%。当然,它不能删除单条数据,只能整个PFADD和PFCOUNT。
import redis
import hashlib
# 连接到Redis
r = redis.Redis(host='localhost', port=6379, db=0)
def check_duplicate(key, item):
"""
使用HyperLogLog检查item是否可能重复
:param key: Redis键名
:param item: 需要检查的数据(需要是字符串或可转换为字符串)
:return: 如果可能为新项返回True,否则返回False
"""
# 将item转换为字符串并计算哈希,确保数据格式统一
item_str = str(item).encode('utf-8')
item_hash = hashlib.md5(item_str).hexdigest()
# 获取添加前的基数
before = r.pfcount(key)
# 尝试添加
r.pfadd(key, item_hash)
# 获取添加后的基数
after = r.pfcount(key)
# 如果基数增加,说明是新项
return after > before
# 使用示例
data_key = "my_unique_set"
items_to_check = ["user1", "user2", "user1", "user3"]
for item in items_to_check:
is_new = check_duplicate(data_key, item)
print(f"Item '{item}' is new: {is_new}")
# 查看最终不重复计数
final_count = r.pfcount(data_key)
print(f"Estimated unique count: {final_count}")
这代码里我做了个 check_duplicate 函数,先MD5哈希一下再塞进HyperLogLog,为了更靠谱。原理就是对比添加前后的计数,变多了就是新的。你跑的时候记得先起个Redis服务。
另外,如果数据量实在太大,一台Redis扛不住,可以考虑一下Redis Cluster或者换用SSDB(一个用硬盘存、兼容Redis协议的东西),不过那就是另一回事了。
总结:内存不够就换HyperLogLog。
布隆过滤器
JAVAER 你好。这不是一个典型的 interview 问题么。
set ()
你的提问简直比怎么毁灭地球还要更宏观
这是在黑吗
你提问真蔡
详细描述看看?
bloom filter 是个好点子
但是有可能会有误判,把不重复的判成重复的吧。
概率很低,自己可以根据情况设置
你提问像蔡徐坤
误判概率很低,但是效率很高
布隆过滤器啊
集合去重啊
换 pika,硬盘版 redis
你先把 url hash 一下,不可能撑不住

