业务需求:源数据库比较庞大,一个简单查询都要几秒到十几秒。现在需要统计某日的部分数据,比如当天有多少用户登录之类,需要按天统计,还需要有个功能要合计。如果一天天去查询,查一次耗费的时间都很长,不用缓存的话,下次再查需要消耗更长时间。
分析与解决:除了当天外,任何一天的数据统计其实都是稳定不变的,因而我们可以考虑把每天统计出来的数据记录起来,下回再查询时便直接从记录里去读取,这里我们用到缓存表。即建一张表,用于记录这些数据(每天查询获得的统计数据)。
一般情况下有缓存表已经可以解决以上的需求了,起码二次查询的速度已经提高很多了。
不过缓存表是存在硬盘里的,想要更快读取数据自然是从内存读取。便要用到缓存。缓存其实可以是自己写的一个类,可以用Dictionary类型来写,该类有add,remove,count,clear等方法。我们可以把数据存在这个类中,就跟把数据存入model的一个道理。因此只要程序还在运行,缓存的数据你不调用方法去清空,它就不会丢,但程序一重启,则缓存就清空了。
业务逻辑:
if(查询日期>=今天){
去源数据库读取数据//当天的数据是动态变化的,不该记录到缓存表或存入缓存
}else{
优先从缓存读取数据//最快
if(缓存有对应日期的key)//根据业务需求决定key是日期或其他参数
{读取缓存数据}
else{
若缓存无数据,尝试查询缓存表
if(缓存表有数据){
读取缓存表数据
}else{
缓存表无数据,则去源数据库读数据;
将新数据存入缓存;
将新数据插入缓存表; }
}
返回读取的数据
}
PS:本文是做缓存的一种方式,缓存的最终目的是提高访问效率,节省服务器资源,我们可以利用各种方式将固定的数据存在合理的位置,在需要的时候从相应位置读取,并在逻辑上进行处理,保证数据不发生异常。所以缓存的方式是有很多种的。