url去重方案:
1. 通过数据库进行url的去重,获取一条数据的时候,将url也保存到数据库中,在获取其他url的时候,先从数据库中查询是否存在这个url,如果存在就丢弃,反之就保存。效率太低。
2. 通过set(),在内存中符url进行去重。 对内存的占用太高。
eg:
100000000条url * 50字符 * 2bytes /1024(KB)/1024(MB)/1024(GB) = 9GB
3. 通过set(),但是不是将url直接保存在set集合中,而是通过一定的加密方式加密后,将加密后的数据保存在set集合中。scrapy框架采用的就是这种方式。md5加密之后数据长度变得统一,变成16位的。
100000000条url * 16字符 * 2bytes /1024(KB)/1024(MB)/1024(GB) = 1GB
4. 布隆过滤
100000000条url * 1(bit) /8(bytes)/1024(MB)/1024(GB) = 12MB
(采用多重哈希映射一个数据,存储该数据的状态 0 1)
100000000条 * 1bit = 12500000Byte = 12500kb = 12.5Mb
数据有可能出现冲突,但是概率已经很小了
布隆过滤是基于内存的,为了保证存储的状态不丢失,最好持久化
5.redis去重