方案一:
建立一张热搜词的数据表 每次用户插入就直接更新该表即可
ID KeyWords Count
缺点:每次搜索后都要Update这张表,高并发的情况就不太好使
方案二:
建立一张热搜词的数据表 每次用户搜索一次,就直接将该用户搜索的词插入数据库(最好使用NoSql而非关系型数据库),毕竟插入数据库的速度要比更新来得快,但是查询起来速度又会减慢
ID KeyWords SearchTime
方案三:
结合方案一与方案二:
定时任务:
每个一段时间将方案二的数据库表里的数据归纳到方案一的数据表里
Sql语句如下:
insert into 方案一的表 (ID,KeyWords,Count)select newid(),KeyWords ,count(*) from
方案二的表 where DateDiff(day,SearchTime,GetDate())<=7 group by KeyWords
解决方法:
采用第三种方案
难点:定时任务
每次用户搜索时,现将搜索的词直接插入到SearchDetails表里,然后每隔一个小时执行上述的Sql语句,将搜索的热词统计到keyWordsRank表里(注意不是使用更新的方法,而是直接删除原表的内容然后再直接添加)
并且应该只统计近期内的,因为长时间内的热搜词没有太大意义
定时任务的解决:
使用Quartz.Net
添加两个dll文件Quartz.dll Common.Logging.dll
Quartz.Net是一个定时任务框架,可以实现异常灵活的定时任务,开发人员只要编写少量的代码就可以实现“每隔1小时执行”、“每天22点执行”、“每月18日的下午执行8次”等各种定时任务。
Quartz.Net中的概念:计划者(IScheduler)、工作(IJob)、触发器(Trigger)。给计划者一个工作,让他在Trigger(什么条件下做这件事)触发的条件下执行这个工作
将要定时执行的任务的代码写到实现IJob接口的Execute方法中即可,时间到来的时候Execute方法会被调用。
编写代码如下:
//每隔一段时间执行任务
IScheduler sched;
ISchedulerFactory sf = new StdSchedulerFactory();
sched = sf.GetScheduler();
JobDetail job = new JobDetail("job1", "group1", typeof(IndexJob));//IndexJob为实现了IJob接口的类
DateTime ts = TriggerUtils.GetNextGivenSecondDate(null, 5);//5秒后开始第一次运行
TimeSpan interval = TimeSpan.FromHours(1);//每隔1小时执行一次
Trigger trigger = new SimpleTrigger("trigger1", "group1", "job1", "group1", ts, null,
SimpleTrigger.RepeatIndefinitely, interval);//每若干小时运行一次,小时间隔由appsettings中的IndexIntervalHour参数指定
sched.AddJob(job, true);
sched.ScheduleJob(trigger);
sched.Start();
要关闭任务定时则需要sched.Shutdown(true)
新建一个类IndexJob实现IJob接口
在接口提供的方法里写上定时任务的具体内容
在Application_start方法里执行上述代码的方法
怎样实现百度的那种效果
使用Jquery-UI
引用Jquery-UI.js 和css文件
使用AutoComplete这个插件(具体用法看demo)
$("#txtKeyWord").autocomplete({
source: "GetAllKeyWords.ashx" //要求返回的是Json对象
});