对于大流量网站数据处理,我们首先想到的是用缓存。缓存能减少服务器的压力,主要表现在数据处理上,访问缓存的时候,数据是不需要通过数据库查询的,这能大大减少
了服务器请求数据库的压力,当用户量大的时候体现 就非常明显
缓存按更新方式分为两种:1. 定期更新缓存 2. 按需更新缓存
定期缓存:根据用户访问判断当前数据的缓存文件是否有5分钟了(时间自己设定)。满足了时间就自动更新缓存, 否则不更新
按需更新:当需要更改缓存的时候就更改缓存文件。
缓存的表现形式有多种:
1. 以txt,.php类型的文件存储缓存数据。
2.缓存服务器来存储数据 比如memcached
3. 非关系型数据库来存储缓存,比如mangoDb
...................
其实大流量的网站我接触的不是太多,刚开始处理的时候都是不管三七二十一的直接select * from 表名,然后
根据sql语句出来的数组写在缓存里。后来渐渐的发现了弊端。当数据量大的时候就显得特别的笨拙,我用来做缓存的
时候文章发布系统的栏目,把栏目的相关数据放在缓存里做处理,因为栏目操作太频繁了,目前的栏目数差不多也有
三千多个。每次循环3000条记录压力还是很轻松的,可一想到每次更改栏目一丁点的信息就得select * 一次心里就不
爽,后来我又想让每个分类都单独存成一个缓存,但这样管理成为一件很困难的事情,所以需要重构缓存的结构便于
以后的扩展。
重构方法:
select * from 表名。
将结果存在一个数组中,并要求这个数组的键是栏目的id。
当栏目操作为增加的时候。获取它的自增id,通过数组的array_push函数加进缓存数组中, 并且写入。
当栏目操作为删除的时候。从缓存中取出数组并且删除删除的那项栏目。并且写入。
当栏目编辑的时候,只更改当前栏目的信息,并且写入。
public function getCache() {
$model = new model();
$sql = "select * from arctype";
$list = $model->findAll($sql);
$arr = array();
foreach($list as $item) {
$arr[$item['id']] = $item;
}
return $arr;
}
这样在绝大部分情况下,不做sql操作,只有在缓存文件不存在的时候,才会做sql操作。
那些定义死的,用的时候却是灵活的。有时候可以两种类型的缓存一起使用。再比如说:我发了一篇文章,这
个时候这个篇所属的分类的文章数字段就得加1,文章的栏目页面假如是静态页面的话,栏目页面就需要更新。如果
每发一篇文章就更新一下,当前栏目的首页和列表页面,那么这个系统以后会涉及随着数据增加越来越难用,越用越
慢。如何避免这个问题呢,我想法是这样的。每发一篇文章相应需要更新的栏目的id存储到某一个数据表中,每5分钟
生成一次栏目,生成的栏目只有有过更新的栏目。发一篇文章更新一回,跟发5分钟文章更新一回,对系统来说不是
一个概念的,这样能省时间减少服务器的压力。如果5分钟后发现统计的数据表中没有记录,就不更新任何栏目。