简单的数据缓存技术[转一] t$U3|r
?TvQ"Y}k
简单的数据缓存技术 t{/hkXq]
,sO:$
近来做了一阵子程序性能的优化工作,有个比较有意思的想法,想提出来和大家交流一下。 mgi,b2
Cache是“以空间换时间”策略的典型应用模式,是提高系统性能的一种重要方法。缓存的使用在大访问量的情况下能够极大的减少对数据库操作的次数,明显降低系统负荷提高系统性能。相比页面的缓存,结果集是一种“原始数据”不包含格式信息,数据量相对较小,而且可以再进行格式化,所以显得相当灵活。由于PHP是“一边编译一边执行”的脚本语言,某种程度上也提供了一种相当方便的结果集缓存使用方法——通过动态include相应的数据定义代码段的方式使用缓存。如果在“RamDisk”上建缓存的话,效率应该还可以得到进一步的提升。以下是一小段示例代码,供参考。 [<]Y+33
Uby,Tu
<? <U@P=G<t
// load data with cache $7Jfb<y
function load_data($id,$cache_lifetime) { nkCecwzr-
jrIA]K6
// the return data
S304ncS|M
$data = array(); u9TzZ
HG2N-<$
// make cache filename -'I _*fu
$cache_filename = ‘cache_‘.$id.‘.php‘; k4S} #!
c5X`_
// check cache file‘s last modify time q:vz?G
$cache_filetime = filemtime($cache_filename); 1*Sr5N[=
\n[
392
if (time() - $cache_filetime <= $cache_lifetime) { ?k
[%\jq{a
//** the cache is not expire 3LKB;
include($cache_filename); CD^CUbGk
} else { "e~k-\^Y
//** the cache is expired S3SV.C:z>
;knd7SC
// load data from database |J:$MX~
// ... xKY$L*
while ($dbo->nextRecord()) { cvKV95bn
// $data[] = ... 1s Br.+p
} -u6}T!
o:_^gJ+|
// format the data as a php file sT)6nV
$data_cache = "<?\r\n"; vT?Q^PTO
while (list($key, $val) = each($data)) { .
3GnZR,L
$data_cache .= "\$data[‘$key‘]=array(‘"; Q(lku"U'
$data_cache .= "‘NAME‘=>\"".qoute($val[‘NAME‘])."\"," BR;QY1
$data_cache .= "‘VALUE‘=>\"".qoute($val[‘VALUE‘])."\""
RXBb:f
$data_cache .= ");\r\n"; pJd 0k"{
}
\;-qdV_JB
$data_cache = "?>\r\n"; o>2e!7
c\M#5+ 1j
// save the data to the cache file 6G'<[gL
j
if ($fd = fopen($cache_filename,‘w+‘)) { 'g]hmE
fputs($fd,$data_cache); IQT cYl
fclose($fd); 3=Z<wD s
} ;P3>>DZ
} 2-~a
P
return $data; [_h%F,_ A
} gF3TwAr
?> lY.B
"ml?7Xl,n
适用情况: Yj)
e$f
1.数据相对比较稳定,主要是读取操作。 QjLji+L
2.文件操作要比数据库操作快。 p"KU7-BfvC
3.复杂数据访问,大数据量访问,密集数据访问,系统数据库负载极重。 O:1DOUYXs
4.Web/DB分离结构或者多Web单DB结构。 -PM)EGSk{
h}avX*Lx_
未经证实的问题: #Rc5c+/(
1.并发访问时对文件的读写是否会引起锁定问题。 eK9TAW
2.涉及到的数据文件太多时,性能如何。 !6Q`>s]
W}>=JoN^J
扩展思路: BjiYv}J
1.生成JavaScript数据定义代码,在客户端调用。 ,*dzJT$k
2.还未想到……