【转载】海量数据排重算法
海量 URL 排重算法
论题假设:
假设只有两台8G 内存的机器。总共会有6亿个URL(每个url长度约为100; 总共长为600亿;大约需要60个G 的空间); 现在有一URL; 需要算法得出,系统中是否存在此URL;如果不存在、就保存到系统中。
使用传统方法直接在数据库建索引:查询会很慢、而且如果多个查询进来;这个方案就死了。
如果使用hash md5(URL) 保存到缓存: 6亿* 18 /1024/1024/1024 ~= 10个G 。单个机器这么大的缓存系统。得使用分布式缓存系统,而且速度而很大影响;新记录的插入、查询压力也很大。
那,如何合理利用这16个G的缓存系统;进行排重运算呢?
第一步:我们在每台机器缓存中建立10000个hash表;那么每个hash 表就只保存 6W条记录;
第二步:我们使用一致性哈希算法,确定URL指向那个hash表 A
第三步:在指定的hash表A中查询URL是否存在,如果不存在、直接将URL 插入hash表A
以上理论实现了URL的快速排重;
检查用户名重复,当数据是海量,怎么保证速度
在数据量不大的时候最多就查一下数据库,看看是否存在
但这个数据量大了以后还是简单的查数据库就会非常慢了
像微博这样要检查用户名是否重复的,几乎都是做提交用户名后就能立即得到反馈,很想知道为什么他们检查重复就能做到很高的速度呢?
几大微博都号称有几亿用户的,检查一下重复的用户名还是非常快呀
把用户名按长度分别缓存到对应的map中,等用户提交时判断用户名长度到对应map中去检查是否存在不知道可靠不。当然写入数据再做一次检查很有必要的。
Redis + MySQL!Redis 用作缓存,先通过 Redis 获取,如果没有的话再从 MySQL 中取并创建 Redis 缓存。
浙公网安备 33010602011771号