问: 我们网站有100多万商户信息,如何最快取出最热门的前10个放到首页。
我说用lucene对数据库做索引;
他说太重了;
我说依据查询的where条件建数据库索引;
他说数据库的优化达到极限了;还能不能再改进;
我说使用缓存技术,比如memcached;把热门的top1000放到cache里面。
他对结果都不满意。
但是可怜我一直做应用开发, 这样的案例没接触过,不知道怎么回答。懂的朋友给个方案把,或者讲讲大型互联网公司,比如taobao,都是怎么做top n的。讲的深入全面的更好。上分200.

解决方案 »

  1.   

    所谓最热门,一般有几种评价方式,当然也可能是组合:
    1、购买数量;
    2、浏览次数;
    3、评论次数。那么首先需要有地方记录了这种数据,偷懒的话就可以是数据库。
    其次,Top100,需要真的是那一瞬间的Top100么?用户在乎是不是这一瞬间么?
    比如可否是截至到00点00分的:昨天Top100?上周Top100?30天Top100?
    那么可否每天晚上用批处理将各种分门别类的Top100计算好,然后生成HTML页面,存放在Apache或者EngineX的上就完了?考虑到全国访问的话,可以将HTML页面推给镜像站点的Apache服务器上。
    嫌硬盘速度慢的话,可以考虑用2G内存来模拟硬盘,专门存放这种高热点的HTML页面。或者Apache上面直接开MemCache。路数很多就不一一列举了。
      

  2.   

    我建议每天0点 定时运行一个程序 生成最热门的10家商户,存入一个文件中
    打开首页时 ajax加载这个文件 显示出来
      

  3.   

    所谓最热门,一般有几种评价方式,当然也可能是组合:
    1、购买数量;
    2、浏览次数;
    3、评论次数。那么首先需要有地方记录了这种数据,偷懒的话就可以是数据库。
    其次,Top100,需要真的是那一瞬间的Top100么?用户在乎是不是这一瞬间么?
    比如可否是截至到00点00分的:昨天Top100?上周Top100?30天Top100?
      

  4.   

    定时器,定时去查数据库(时间根据情况定),生成XML,然后TOP10直接读取XML,
    数据只要操作一次,取数据相当于直接是IO操作,效率肯定比你的数据库取的效率高的多澳~
      

  5.   

    定时、接口缓存。
       写个跟前台无关的接口。定义两个map,一个定时去load数据库,一个由前台调用。
    第一个map load完后,赋给前台调用的map。map之间赋值很快吧。
       我用的是rmi接口,效果不错。
      

  6.   

    估计他的意思是要用bitmap或者hash来做吧
      

  7.   

    我以前做过这种,你写个job,每隔段时间查出前100条,建个过程,存到一个临时表中(存的时候先把以前的数据删除),将来直接从临时表取
      

  8.   

    预处理就行,使用memcache或者写文件都行;写一个服务或者Window应用程序,放到服务器上跑,每隔一段时间进行统计或者一直统计,将统计结果放到memcache或者文件里面,前端页面直接读取memcache结果或者文件里面的数据即可;这样对于前端页面来说,基本上不存在什么性能问题!
      

  9.   

    使用redis的Sorted sets,http://blog.nosqlfan.com/html/2235.html
      

  10.   

    这玩意又不要求实时,看看淘宝,都TMD静态发布的。
    这问的 但凡扯到 数据库SQL查询肯定OVER
      

  11.   

    建议大家同时关注一下这个主题, 把您见过的同类的互联网公司的面试题发到这里: http://topic.csdn.net/u/20120718/22/725e5e98-2dad-41fa-b43f-7aae2197002f.html
      

  12.   

    赞同26楼的方案,建议楼主学习下,redis的Sorted sets可以很好的解决这个问题。
      

  13.   

    为什么memcached不行呢,稍微多取出来一些,访问都直接访问memcached。定时再与数据库进行同步。这个量级感觉缓存还是比较适用啊!
      

  14.   

    100万的这种数据,如果分析topN这种逻辑不是太复杂,一般不用做临时表了吧。如果数据量太大,可以做个临时表,找个数据库压力比较小的时间定时执行,然后生成静态的页面
      

  15.   

    建议大家同时关注一下这个主题, 把您见过的同类的互联网公司特有的面试题发到这里: http://topic.csdn.net/u/20120718/22/725e5e98-2dad-41fa-b43f-7aae2197002f.html
      

  16.   

    缓存,JOB都可以,就看面试官怎么想来
      

  17.   

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

  18.   

    对于楼上赞成用定时器类方法的朋友,我想追加得问一句。如果此时xml的数据不是最新的数据,也就是说我xml生成的时候取的不是最新数据库表中的数据,那么此时我从xml读取的时候可能不是最新的数据,怎么办?难道要用线程不停的监视?
      

  19.   

    首页上得top10,几乎都是后台推荐的。  还能收推荐费呢,哎
      

  20.   

    建1个servlet,application中保存商户点击率。再不定时的保存到数据库中