个Map类非常好,你可以将压缩后的URL串作为Key,而将 Boolean作为Value进行存储,然后将工作中的Map在爬虫停止工作后序列化到本地磁盘上;当下一次启动新的爬虫任务的时候,再将这个Map反序列化到内存中,供爬虫进行URL去重检测。 2.2.2.4 基于嵌入式Berkeley DB的存储 Berkeley DB的特点就是只存储键值对类型数据,这和URL去重有很大关系。去重,可以考虑对某个键,存在一个值,这个值就是那个键的状态。使用了Berkeley DB,你就不需要考虑进行磁盘IO操作的性能损失了,这个数据库在设计的时候很好地考虑了这些问题,并且该数据库支持高并发,支持记录的顺序存储和随机存储,是一个不错的选择。 URL去重存储库使用Berkeley DB,压缩后的URL字符串作为Key,或者直接使用压缩后的URL字节数组作为Key,对于Value可以使用Boolean,一个字节,或者使用字节数组,实际Value只是一个状态标识,减少Value存储占用存储空间。 2.2.2.5 基于布隆过滤器(Bloom Filter)的存储使用布隆过滤器,设计多个Hash函数,也就是对每个字符串进行映射是经过多个Hash函数进行映射,映射到一个二进制向量上,这种方式充分利用了比特位。不过,以前没有用过这种方式,有机会可以论证一下。可以参考Google 的7/07/bloom-filter.html。 2.2.3 LRU算法实现URL消重用双向链表来实现大容量cache的LRU算法。原理是:cache的所有位置都用双向链表连接起来,当一个位置被命中后,就将通过调整链表的指向将该位置调整到链表的头位置,新加入的内容直接放在链表的头上。这样,在进行过多次查找操作后,最近被命中过的内容就像链表的头移动,而没有命中过的内容就向链表的后面移动。当需要替换时,链表最后的位置就是最近最少被命