開(kāi)發(fā)一個(gè)高性能的web服務(wù),緩存是必不可少的。緩存是萬(wàn)金油,下面介紹下我們web服務(wù)中用到了哪些緩存
1、前端緩存
對(duì)于靜態(tài)資源,有三種方式。
- 根據(jù)last modified time,詢(xún)問(wèn)web server是否有更新,若not modified,則讓瀏覽器使用本地緩存
- 根據(jù)etag標(biāo)識(shí),web server對(duì)比瀏覽器傳過(guò)來(lái)的etag與服務(wù)器計(jì)算出的etag,若不同則返回最新的內(nèi)容給瀏覽器。使用etag優(yōu)于使用last modified time機(jī)制,畢竟基于內(nèi)容算出來(lái)的標(biāo)記更為靠譜。
- 根據(jù)expire標(biāo)識(shí),若max-age大于0,則可以使用本地緩存,完全不用請(qǐng)求web server
2、cdn
前端項(xiàng)目中依賴(lài)的資源(js,css等),在打包后會(huì)自動(dòng)上傳到cdn上,從而加速用戶(hù)訪問(wèn)。
cnd是由分布在不同區(qū)域的邊緣節(jié)點(diǎn)服務(wù)器群組成的分布式網(wǎng)絡(luò),替代傳統(tǒng)以WEB Server為中心的數(shù)據(jù)傳輸模式。將用戶(hù)的請(qǐng)求分配至最適合他的節(jié)點(diǎn),使用戶(hù)可以以最快的速度取得他所需的內(nèi)容,有效解決Internet網(wǎng)絡(luò)擁塞狀況,提高用戶(hù)訪問(wèn)的響應(yīng)速度。
3、vanish本地緩存
項(xiàng)目中使用了varnish作為本地緩存。使用vanish將對(duì)讀性能要求較高的配置類(lèi)接口進(jìn)行緩存(必須是get接口,并且響應(yīng)的httpcode為200)。vanish在后端機(jī)器上監(jiān)聽(tīng)8081端口,訪問(wèn)后端服務(wù)時(shí),需要指定proxy為127.0.0.1:8081當(dāng)本地vanish中緩存未過(guò)期時(shí),讀取緩存內(nèi)容后直接返回。當(dāng)緩存滿(mǎn)時(shí),vanish會(huì)根據(jù)LRU機(jī)制,把最舊的object釋放掉。
4、redis 分布式緩存
使用varnish,可以在不侵入代碼的情況下,緩存住大量讀的接口。而在某些情況下,需要使用redis這種分布式緩存,在多臺(tái)機(jī)器之間緩存數(shù)據(jù)。redis提供了豐富的數(shù)據(jù)結(jié)構(gòu)與查詢(xún)接口,事實(shí)上redis也是我們使用比較多的緩存之一。 但如果緩存的某個(gè)數(shù)據(jù)過(guò)大,例如幾十MB,反復(fù)讀取也會(huì)造成redis性能的下降。
5、apcu 進(jìn)程間緩存
php5.5以后,opcache將代替apc做為php加速的位置,也就是代替其系統(tǒng)緩存的位置。并將用戶(hù)緩存功能獨(dú)立出來(lái),開(kāi)啟新的組件,這個(gè)組件名稱(chēng)叫做apcu。使用時(shí)需要安裝,并且在ini文件中加上apc.enabled=on打開(kāi)。
apcu 使用共享內(nèi)存機(jī)制,可以在同一臺(tái)server的不同進(jìn)程間緩存數(shù)據(jù)。apcu將數(shù)據(jù)緩存在內(nèi)存中,相比redis等分布式緩存,省去了網(wǎng)絡(luò)io的時(shí)間,性能會(huì)更好。 但apcu對(duì)緩存內(nèi)存大小有要求。
public static function get($key, $fun, $ttl)
{
if (!static::$isOpen || $ttl == 0) {
return call_user_func($fun);
}
if (apcu_exists($key)) {
return apcu_fetch($key);
}
$data = call_user_func($fun);
if ($data) {
apcu_store($key, $data, $ttl);
}
return $data;
}
6、變量static緩存
在函數(shù)內(nèi)將變量聲明為static,在一次連接中可反復(fù)使用。速度快,效率高,實(shí)現(xiàn)簡(jiǎn)單
7、opcache緩存
當(dāng)解釋器完成對(duì)腳本代碼的分析后,便將它們生成可以直接運(yùn)行的中間代碼,也稱(chēng)為操作碼(Operate Code,opcode)。Opcode cache的目地是避免重復(fù)編譯,減少CPU和內(nèi)存開(kāi)銷(xiāo)。
8、mysql查詢(xún)緩存
MySQL查詢(xún)緩存可以跳過(guò)SQL解析優(yōu)化查詢(xún)等階段,直接返回緩存結(jié)果給用戶(hù)。當(dāng)然前提比較苛刻,需要兩次查詢(xún)環(huán)境與sql完全一樣