数据缓存主要是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, 并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。
用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。
举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个 数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。
页面缓存
每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问 的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)
时间触发缓存
检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。
内容触发缓存
当插入数据或更新数据时,强制更新缓存。
静态缓存
这里所说的静态缓存是指静态化,直接生成HTML或xml等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。
内存缓存
Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
$memcache=newMemcache; $memcache->connect(‘localhost’,11211)ordie(“Couldnotconnect”); $version=$memcache->getVersion(); echo“Server’sversion:“.$version.”\n”; $tmp_object=newstdClass; $tmp_object->str_attr=‘test’; $tmp_object->int_attr=123; $memcache->set(‘key’,$tmp_object,false,10)ordie(“Failedtosavedataattheserver”); echo“Storedatainthecache(datawillexpirein10seconds)\n”; $get_result=$memcache->get(‘key’); echo“Datafromthecache:\n”; var_dump($get_result); ?>
读库的例子:
$sql=‘SELECT*FROMusers’; $key=md5($sql);//memcached对象标识符 if(!($datas=$mc->get($key))){ //在memcached中未获取到缓存数据,则使用数据库查询获取记录集 echo“n”.str_pad(‘ReaddatasfromMySQL.’,60,‘_’).”n”; $conn=mysql_connect(‘localhost’,‘test’,‘test’); mysql_select_db(‘test’); $result=mysql_query($sql); while($row=mysql_fetch_object($result)) $datas[]=$row; //将数据库中获取到的结果集数据保存到memcached中,以供下次访问时使用 $mc->add($key,$datas); }else{ echo“n”.str_pad(‘Readdatasfrommemcached.’,60,‘_’).”n”; } var_dump($datas); ?>
PHP的缓冲器
比如eaccelerator,apc,phpa,xcache等等。
MySQL缓存
这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的。
[client]…… default-character-set=gbk default-storage-engine=MYISAM max_connections=600 max_connect_errors=500 back_log=200 interactive_timeout=7200 query_cache_size=64M …… table_cache=512 …… myisam_max_sort_file_size=100G myisam_max_extra_sort_file_size=100G myisam_sort_buffer_size=128M key_buffer_size=1024M read_buffer_size=512M …… thread_concurrency=8
基于反向代理的Web缓存
如Nginx,SQUID,mod_PRoxy(apache2以上又分为mod_proxy和mod_cache)
NGINX的例子:
#usernobody; worker_processes4; error_loglogs/error.logcrit; pidlogs/nginx.pid; worker_rlimit_nofile10240; events{ useepoll; worker_connections51200; } http{ includemime.types; default_typeapplication/octet-stream; sendfileon; keepalive_timeout65; tcp_nodelayon; #serverpool upstreambspfrontsvr{ server10.10.10.224:80weight=1; server10.10.10.221:80weight=1; } upstreambspimgsvr{ server10.10.10.201:80weight=1; } upstreambspstylesvr{ server10.10.10.202:80weight=1; } upstreambsphelpsvr{ server10.10.10.204:80weight=1; } upstreambspwsisvr{ server10.10.10.203:80weight=1; } upstreambspadminsvr{ server10.10.10.222:80weight=1; } upstreambspbuyersvr{ server10.10.10.223:80weight=1; } upstreambspsellersvr{ server10.10.10.225:80weight=1; } upstreambsploginsvr{ server10.10.10.220:443weight=1; } upstreambspregistersvr{ server10.10.10.220:80weight=1; } log_formattest_com‘$remote_addr–$remote_user[$time_local]“$request”‘ ‘$status$body_bytes_sent“$http_referer”“$http_user_agent”‘; #——————————————————————– #img.test.com server{ listen10.10.10.230:80; server_nameimg.test.com; location/{ proxy_passhttp://bspimgsvr; includeproxy_setting.conf; } access_loglogs/img.logtest_com; } #style.test.com server{ listen10.10.10.230:80; server_namestyle.test.com; location/{ proxy_passhttp://bspstylesvr; includeproxy_setting.conf; } access_loglogs/style.logtest_com; } #help.test.com server{ listen10.10.10.230:80; server_namehelp.test.com; location/{ proxy_passhttp://bsphelpsvr; includeproxy_setting.conf; } access_loglogs/help.logtest_com; } #admin.test.com server{ listen10.10.10.230:80; server_nameadmin.test.com; location/{ proxy_passhttp://bspadminsvr; includeproxy_setting.conf; } access_loglogs/admin.logtest_com; } #buyer.test.com server{ listen10.10.10.230:80; server_namebuyer.test.com; location/{ proxy_passhttp://bspbuyersvr; includeproxy_setting.conf; } access_loglogs/buyer.logtest_com; }
#seller.test.comserver{ listen10.10.10.230:80; server_nameseller.test.com; location/{ proxy_passhttp://bspsellersvr; includeproxy_setting.conf; } access_loglogs/seller.logtest_com; } #wsi.test.com server{ listen10.10.10.230:80; server_namewsi.test.com; location/{ proxy_passhttp://bspwsisvr; includeproxy_setting.conf; } access_loglogs/wsi.logtest_com; } #www.test.com server{ listen10.10.10.230:80; server_namewww.test.com*.test.com; location~^/NginxStatus/{ stub_statuson; access_logoff; } location/{ proxy_passhttp://bspfrontsvr; includeproxy_setting.conf; } access_loglogs/www.logtest_com; error_page500502503504/50x.html; location=/50x.html{ roothtml; } } #login.test.com server{ listen10.10.10.230:443; server_namelogin.test.com; sslon; ssl_certificatecert.pem; ssl_certificate_keycert.key; ssl_session_timeout5m; ssl_protocolsSSLv2SSLv3TLSv1; ssl_ciphersALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_cipherson; location/{ proxy_passhttps://bsploginsvr; includeproxy_setting.conf; } access_loglogs/login.logtest_com; } #login.test.comforregister server{ listen10.10.10.230:80; server_namelogin.test.com; location/{ proxy_passhttp://bspregistersvr; includeproxy_setting.conf; } access_loglogs/register.logtest_com; } }
mod_proxy的例子:
ServerNamewww.zxsv.com ServerAdminadmin@zxsv.com #reverseproxysetting ProxyPass/http://www.zxsv.com:8080/ ProxyPassReverse/http://www.zxsv.com:8080/ #cachedirroot CacheRoot“/var/www/proxy” #maxcachestorage CacheSize50000000 #hour:every4hour CacheGcInterval4 #maxpageexpiretime:hour CacheMaxExpire240 #Expiretime=(now–last_modified)*CacheLastModifiedFactor CacheLastModifiedFactor0.1 #defaltexpiretag:hour CacheDefaultExpire1 #forcecompleteafterprecentofcontentretrived:60-90% CacheForceCompletion80 CustomLog/usr/local/apache/logs/dev_access_logcombined