浪子.蔺文龙的博客

回首,至少我去做了

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  搜索自动完成功能,很多网站中都有使用,网上也有很多插件可以实现类似的功能,但这种功能却恰恰应了那句老话“台前一分钟,台后十年功” (哈哈,可以这样比喻吧),前台用ajax+CSS,后台查询数据库返回xml、json、txt等类型的数据即可。一般情况下,这样的设计不会有任何问题,老板还会夸你“小伙,手脚挺麻利的,三下两下就搞了”。。。。但如果是应用在高流量高并发的网站上,负载压力很快就会呈现出来。

     比如,像日PV 500,000,IP30,000 的网站,假如UV有10,000,每UV有两次搜索操作(不算多吧,本文章本身就是侧重搜索比较重要的网站),相当于每天有2W次搜索,     每次搜索提示需要查询数据库2次(因为要搜索两个表),     再加上搜索结果页至少 5 次的数据库查询,相当于一次搜索操作产生数据库查询 7 次,即仅搜索一项,每天产生数据库查询 140,000次,相当于每秒1.6次,集中在高峰时段的时候,网站压力可想而知。

 

    所以需要考虑进行优化,下面说说优化思路。

    先分析占用资源的几个操作

    1、输入框使用onkeyup事件,每次按一个按键就立即触发ajax,访问后台页面进行数据库查询。

    经常还出现输入错误一下子出现好多字,又一个个删除的情况,每删除一个字都触发ajax。

    2、进入后台程序后,对于传递来的关键字,遍历数据库,得到相应结果。

    3、用户从提示中选择关键字,提交,进行搜索结果页,显示搜索结果。(这一步的优化不在本文讨论范围)

    优化思路:

    针对第一点,主要可通过对按键事件的时间间隔做处理,比如按下按键一秒钟后再触发事件,如果一秒内用户再次按下按键即取消前面的事件,可以考虑通过js的SetTimeOut和clearTimeout两个方法。

    再就是有一点值得注意,在用ajax异步请求后台程序时,使用get方法,并且不要加时间戳,这样ajax即会自动进行浏览器级别的缓存,当得到一次这个关键字的结果后,只要不关闭浏览器,下次再访问, 都会在不触发后台程序的情况下迅速得到结果。

    以上两点并用,可在前台界面中即大大提升性能,非常值得一用。

    针对第二点(本文重点考虑的) :

    比如简单粗暴的优化方法是,将所有关键字的查询结果都进行缓存,下次再有这个关键字的访问时,就直接从缓存里返回。

    这种方法代码实现倒时快速,但对资源的浪费也最严重,假如一天有1W个关键字搜索,其中八千个都是只有一次搜索,岂不是严重浪费?

     改进:

    所以就要进行有选择的缓存,对热门搜索进行缓存。这样就需要借助一个中间数据源进行判断从而有选择的缓存。

    假如我们用一个searchkey表存储每次搜索的关键字,有两个字段key(关键字) 和 num(搜索次数),后台程序页,每次更新关键字的查询次数。

      这里还需要插述一点:对于超大访问量的网站,即使最简单的一句update talbename set field=field+1 where id=1  这样的sql,在高并发时段,也会发生错误,由于访问量过大,又同时存在读、写操作,数据库会形成死锁,导致程序直接抛出错误。解决办法就是将Update操作也做缓存处理,将每次进行update优化为将num的累加存入缓存,然后每分钟一次进行一次update,这样就基本上避免出现死锁的情况了。      

    取出searchkey表的热门关键字TOP100,并放入缓存。

    当接到一个请求时,通过遍历热门关键字缓存,判断关键字的查询方式。如果是热门关键字,通过查询数据库得到结果后,放入关键字的结果缓存,下次直接从缓存中返回结果。非热门关键字,仍直接查询数据库然后返回结果,即使这样,也不会对数据库造成较大压力。

 

     还可以优化吗?当然,这一点也是这篇文章最想拿出来跟大家讨论的。

    进阶:通过静态文件实现不占用内容的优化。

    同样需要借助searchkey表和TOP100缓存,不同的是,将TOP100缓存的关键字的结果写成文本文件,当有请求时,直接将页在转发到对应的文本文件页,提高效率的同时也节约了服务器资源。

    使用这种方式,就可以扩大热门关键字的缓存数量,因为只是简单的字词内容,相对占用资源很少,只要维护好热门关键字缓存并生成对应的结果文本文件即可。

    

  文章写得很随意,欢迎批评指正。

 

 

 

 

 

 

 

posted on 2010-07-02 18:24  蔺文龙  阅读(2353)  评论(8编辑  收藏  举报
无觅相关文章插件,快速提升流量