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 一下,不可能撑不住

回到顶部