日期:2014-05-17  浏览次数:20651 次

一个关于性能的面试问题
问: 我们网站有100多万商户信息,如何最快取出最热门的前10个放到首页。
我说用lucene对数据库做索引;
他说太重了;
我说依据查询的where条件建数据库索引;
他说数据库的优化达到极限了;还能不能再改进;
我说使用缓存技术,比如memcached;把热门的top1000放到cache里面。
他对结果都不满意。
但是可怜我一直做应用开发, 这样的案例没接触过,不知道怎么回答。

懂的朋友给个方案把,或者讲讲大型互联网公司,比如taobao,都是怎么做top n的。讲的深入全面的更好。上分200.

------解决方案--------------------
其实这种不需要现从数据库里取,这样的方式,无论再怎么优化查询,都是“慢”的。
楼主可以跳出来换一个角度想。
比如我就把访问量最大的前十个放到内存里,然后动态的根据访问量的变化,每隔一段时间去更新这块内存。所以内存中始终放着最热门的前十个商户的信息。想要拿出来的话随时从内存中拿出来就是了。

当然上面说的每隔一段时间,不用太频繁,频繁也没有实际意义,因为最热门的也是一段时间内的,这个不需要实时。
(关于如何更新那块内存,保持最热门的十家,看具体需要,提供不同的算法,这不在面试官所要的回答之中,他要的是上面说的那种思路。)
------解决方案--------------------
所谓最热门,一般有几种评价方式,当然也可能是组合:
1、购买数量;
2、浏览次数;
3、评论次数。

那么首先需要有地方记录了这种数据,偷懒的话就可以是数据库。


其次,Top100,需要真的是那一瞬间的Top100么?用户在乎是不是这一瞬间么?
比如可否是截至到00点00分的:昨天Top100?上周Top100?30天Top100?


那么可否每天晚上用批处理将各种分门别类的Top100计算好,然后生成HTML页面,存放在Apache或者EngineX的上就完了?考虑到全国访问的话,可以将HTML页面推给镜像站点的Apache服务器上。
嫌硬盘速度慢的话,可以考虑用2G内存来模拟硬盘,专门存放这种高热点的HTML页面。或者Apache上面直接开MemCache。路数很多就不一一列举了。
------解决方案--------------------
我建议每天0点 定时运行一个程序 生成最热门的10家商户,存入一个文件中
打开首页时 ajax加载这个文件 显示出来
------解决方案--------------------
所谓最热门,一般有几种评价方式,当然也可能是组合:
1、购买数量;
2、浏览次数;
3、评论次数。

那么首先需要有地方记录了这种数据,偷懒的话就可以是数据库。


其次,Top100,需要真的是那一瞬间的Top100么?用户在乎是不是这一瞬间么?
比如可否是截至到00点00分的:昨天Top100?上周Top100?30天Top100?


------解决方案--------------------
定时、接口缓存。
写个跟前台无关的接口。定义两个map,一个定时去load数据库,一个由前台调用。
第一个map load完后,赋给前台调用的map。map之间赋值很快吧。
我用的是rmi接口,效果不错。
------解决方案--------------------
我比较赞同写一个程序,建一张表,设定在每隔几天之后就让这个程序执行一次,这个程序的作用是将最热门的访问保存到这一张表中,这张表中的数据就供前台首页调用
------解决方案--------------------
我以前做过这种,你写个job,每隔段时间查出前100条,建个过程,存到一个临时表中(存的时候先把以前的数据删除),将来直接从临时表取
------解决方案--------------------
探讨
都是好主意。

------解决方案--------------------
我们网站有100多万商户信息,如何最快取出最热门的前10个放到首页
这里说了100多万商户 是基本数据吧,热门肯定在这个一百多万上建立的嘛,比如说没访问一下这个商户就会给这个商户增加一点热点的话,可以这样考虑撒,建立一个前十的list有序的装进去,当有访问时,在存进数据库的同时比较下list的,在替换就ok咯撒