摘要:我們很容易修改緩存驅(qū)動(dòng)方式。這樣的話,我們甚至根本不必檢查緩存是否過期。與驅(qū)動(dòng)相比,和的速度更快,所以建議在項(xiàng)目較大時(shí)使用外部緩存驅(qū)動(dòng)。結(jié)論使用文件數(shù)據(jù)庫(kù)作為驅(qū)動(dòng),兩者在速度上沒有很明顯的區(qū)別。所以投資高速緩存是值得的。
緩存是web開發(fā)中重要的一部分,我相信很多人和我一樣,經(jīng)常忽略這個(gè)問題。 隨著工作經(jīng)驗(yàn)的累積,我已經(jīng)意識(shí)到緩存是多么的重要,這里我通過 Scotch 來解釋一下它的重要性。
通過觀察發(fā)現(xiàn),Scotch每天按照計(jì)劃發(fā)布文章,然而,上一次發(fā)布文章的24小時(shí)內(nèi),新的文章不會(huì)被放出,因此,登陸頁(yè)面上的數(shù)據(jù)將保持24小時(shí)不變。 換句話說,在24小時(shí)內(nèi)( 更準(zhǔn)確的說是22-23個(gè)小時(shí))向數(shù)據(jù)庫(kù)請(qǐng)求文章數(shù)據(jù)是沒有意義的。
緩存可以很好的解決這個(gè)問題,當(dāng)遇到一個(gè)頁(yè)面請(qǐng)求時(shí),我們可以把結(jié)果緩存22個(gè)小時(shí),只要在這個(gè)時(shí)間內(nèi)通過控制器請(qǐng)求的數(shù)據(jù),都是緩存中的數(shù)據(jù),直到緩存超時(shí)。
下面我們來看看Laravel 中緩存的基本用法,然后看一個(gè)簡(jiǎn)單的例子,試試緩存到底能帶來多大的加速。在 Laravel 中緩存的基本用法
Laravel 使得我們可以輕松地轉(zhuǎn)換出我們想要生成緩存的方式。我們很容易修改緩存驅(qū)動(dòng)方式。只需到 config / cache.php 來查看可用的驅(qū)動(dòng)程序:
apc
array
database
file
memcached
redis
你可以在?.env?文件中修改緩存驅(qū)動(dòng):
CACHE_DRIVER=file
你可以繼續(xù)嘗試修改它們而不用擔(dān)心配置,因?yàn)樗J(rèn)驅(qū)動(dòng)是 file 。
Cache facade 暴露了很多靜態(tài)方法來創(chuàng)建,更新,獲取,刪除和檢查緩存內(nèi)容的存在。讓我們?cè)跇?gòu)建演示應(yīng)用程序之前先了解一下這些方法。
建立/更新緩存值我們使用?put()?方法來新增或更新緩存值。該方法必須使用 3 個(gè)參數(shù):
鍵名
鍵值
過期時(shí)間?單位分鐘
例如:
Cache::put("key", "value", 10);
?鍵名 是緩存的唯一標(biāo)識(shí),需要時(shí)要用它來獲取值。
此外,我們也可以用?remember()?方法自動(dòng)獲取和更新一個(gè)緩存值。該方法首先檢查?鍵名 是否存在,如果已經(jīng)創(chuàng)建則返回結(jié)果。否則它會(huì)創(chuàng)建新的?鍵名 ,并用閉包返回結(jié)果進(jìn)行賦值,就象下面:
Cache::remember("articles", 15, function() { return Article::all(); });
參數(shù)?15 是要緩存的分鐘數(shù)。這樣的話,我們甚至根本不必檢查緩存是否過期。Laravel 不僅會(huì)替我們打理,而且會(huì)獲取或重新生成該緩存,不需要我們顯式地告訴它如何操作。
檢索緩存值緩存的值可以通過?get()?方法去獲取,這個(gè)方法接受一個(gè)參數(shù)?key?:
Cache::get("key");檢查是否已存在key
有時(shí)候在更新或者取回緩存值之前判斷這個(gè)緩存的key是否存在是很有必要的,使用 has()?方法就可以實(shí)現(xiàn):
if (Cache::has("key")){ Cache::get("key"); } else { Cache::put("key", $values, 10); }刪除緩存值
刪除緩存值可以用?forget()?方法并把需要?jiǎng)h除的?key?作為參數(shù)傳進(jìn)去:
Cache::forget("key");
我們也可以檢索緩存值并刪除它。我喜歡把這個(gè)稱為一次性緩存:
$articles = Cache::pull("key");
我們還可以使用以下命令在緩存過期前就把所有緩存清楚掉:
php artisan cache:clear一個(gè)例子
這是一個(gè)簡(jiǎn)單的演示,主要是為了說明是否使用緩存對(duì)請(qǐng)求響應(yīng)所需要時(shí)間的影響,為了讓你能更直接的了解,我建議你跟著教程自己來?構(gòu)建?一個(gè) Laravel 例子。
模型和表遷移使用下面命令新建一個(gè)?Article?模型:
php artisan make:model Article -m
?-m?參數(shù)會(huì)自動(dòng)創(chuàng)建一個(gè) migration ,所以無需再使用 create migration 命令了,這個(gè)命令會(huì)創(chuàng)建?App/Article.php 和 ?database/migrations/xxxx_xx_xx_xxxxxx_create_articles_table.php?文件。
修改你的 migration 文件并添加以下兩行:
public function up() { Schema::create("articles", function (Blueprint $table) { $table->increments("id"); // add the following $table->string("title"); $table->string("content"); $table->timestamps(); }); }
然后我們就可以用以下命令遷移我們的數(shù)據(jù)庫(kù)了:
php artisan migrate填充數(shù)據(jù)庫(kù)
接下來我們需要填充文章的數(shù)據(jù)庫(kù)表,在?database/seeds/DatabaseSeeder.php 中,修改 ?run()?如下所示:
public function run() { Model::unguard(); // use the faker library to mock some data $faker = Faker::create(); // create 30 articles foreach(range(1, 30) as $index) { Article::create([ "title" => $faker->sentence(5), "content" => $faker->paragraph(6) ]); } Model::reguard(); }
Laravel中包含?Faker?庫(kù)用以快速生成假數(shù)據(jù),我們可以使用PHP的?range()?方法去生成30條假數(shù)據(jù)。
接下來我們就可以通過這條 artisan 命令去填充數(shù)據(jù)庫(kù)了:
php artisan db:seed創(chuàng)建文章控制器
接下來,我們可以創(chuàng)建一個(gè)處理請(qǐng)求和緩存的控制器,首先它是空的:
php artisan make:controller ArticlesController
...然后我們?cè)黾右粋€(gè)路由?app/Http/routes.php?指向這個(gè)文章控制器的 index 方法:
Route::group(["prefix" => "api"], function() { Route::get("articles", "ArticlesController@index"); });
現(xiàn)在我們的數(shù)據(jù)庫(kù)都是用樣本數(shù)據(jù)建立起來的,我們可以進(jìn)行測(cè)試了。
未使用緩存的響應(yīng)讓我們看看我們傳統(tǒng)的控制器方法是什么樣的,沒有緩存,處理響應(yīng)需要多長(zhǎng)時(shí)間,在?index()?方法中,返回文章的資源數(shù)據(jù):
public function index() { $articles = Articles::all(); return response()->json($articles); }
你也可以使用?Postman?去請(qǐng)求(http://localhost/api/articles) 或者直接用瀏覽器打開,你就可以看到如下所示。
請(qǐng)注意在本地開發(fā)服務(wù)器上完成此請(qǐng)求所花費(fèi)的時(shí)間。
從緩存中返回的響應(yīng)現(xiàn)在讓我們嘗試使用緩存,看看數(shù)據(jù)響應(yīng)所花費(fèi)的時(shí)間是否會(huì)有顯著差異。修改 index()方法為:
public function index() { $articles = Cache::remember("articles", 22*60, function() { return Article::all(); }); return response()->json($articles); }
現(xiàn)在我們使用?remember()?方法緩存了文章,緩存時(shí)間為 22 小時(shí),再次運(yùn)行并觀察所花費(fèi)的時(shí)間,可以看我的截圖:
結(jié)果和建議在我的標(biāo)準(zhǔn)開發(fā)環(huán)境中測(cè)試得出,使用緩存時(shí)產(chǎn)生響應(yīng)所需的時(shí)間比沒有使用的時(shí)候要少:
未使用緩存Server Hits | Time |
---|---|
1st | 4478ms |
2nd | 4232ms |
3rd | 2832ms |
4th | 3428ms |
Avg | 3742ms |
Server Hits | Time |
---|---|
1st | 4255ms |
2nd | 3182ms |
3rd | 2802ms |
4th | 3626ms |
Avg | 3466ms |
Server Hits | Time |
---|---|
1st | 3626ms |
2nd | 566ms |
3rd | 1462ms |
4th | 1978ms |
Avg | 1908ms?:) |
這里需要通過 composer 安裝 predis/predis 包
Server Hits | Time |
---|---|
1st | 3549ms |
2nd | 1612ms |
3rd | 920ms |
4th | 575ms |
Avg | 1664ms?:) |
是不是很酷呢?這里有兩點(diǎn)需要注意:
即使使用了緩存,第一次請(qǐng)求響應(yīng)還是需要比較多的時(shí)間,因?yàn)楫?dāng)?shù)谝淮握?qǐng)求的時(shí)候緩存里面還是空的。
與 file 驅(qū)動(dòng)相比,Memcached 和 Redis 的速度更快,所以建議在項(xiàng)目較大時(shí)使用外部緩存驅(qū)動(dòng)。
結(jié)論使用文件、數(shù)據(jù)庫(kù)作為驅(qū)動(dòng),兩者在速度上沒有很明顯的區(qū)別。但是如果我們使用第三方服務(wù)作為驅(qū)動(dòng), 可以很明顯地看到性能提升。所以投資高速緩存是值得的。
更多現(xiàn)代化 PHP 知識(shí),請(qǐng)加入 PHP / Laravel 知識(shí)社區(qū) 一起學(xué)習(xí)成長(zhǎng)吧。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28503.html
摘要:使用即時(shí)編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能,之前做個(gè)一個(gè)實(shí)驗(yàn),具體請(qǐng)見使用提升程序性能。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū) 說明 性能一直是 Laravel 框架為人詬病的一個(gè)點(diǎn),所以調(diào)優(yōu) Laravel 程序算是一個(gè)必學(xué)的技能。 接下來分享一些開發(fā)的最佳實(shí)踐,還有調(diào)優(yōu)技巧,大家有別的建議也歡迎留言討論。 這里是簡(jiǎn)單的列表: 配置信...
摘要:什么是官網(wǎng)是一個(gè)由組件搭建而成的微框架是當(dāng)前最快的框架之一在什么時(shí)候使用專為微服務(wù)或者設(shè)計(jì)舉個(gè)例子如果你的應(yīng)用里面有部分業(yè)務(wù)邏輯的請(qǐng)求頻率比較高就可以單獨(dú)把這部分業(yè)務(wù)邏輯拿出來使用來構(gòu)建一個(gè)小因?yàn)槭菍?duì)優(yōu)化了框架的加載機(jī)制所以對(duì)資源的要求少很 什么是 Lumen?官網(wǎng) lumen 是一個(gè)由 Laravel 組件搭建而成的微框架,是當(dāng)前最快的 PHP 框架之一! 在什么時(shí)候使用 Lume...
摘要:的現(xiàn)狀目前是版本,是基于開發(fā)。入口文件啟動(dòng)文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會(huì)提示找不到類。目前支持四種數(shù)據(jù)庫(kù)系統(tǒng)以及。使用時(shí)發(fā)生錯(cuò)誤,因?yàn)樵谖募?,的默認(rèn)驅(qū)動(dòng)是。 最近使用 Lumen 做了 2 個(gè)業(yè)余項(xiàng)目,特此記錄和分享一下。 Lumen 的介紹 在使用一項(xiàng)新的技術(shù)時(shí),了解其應(yīng)用場(chǎng)景是首要的事情。 Lumen 的口號(hào):為速度而生的 La...
摘要:說明本文主要講述使用作為緩存加快頁(yè)面訪問速度。何不用來做緩存,等到該達(dá)到一定瀏覽頁(yè)面后再刷新下,效率也很高??勺骶彺嫦到y(tǒng)隊(duì)列系統(tǒng)。 說明:本文主要講述使用Redis作為緩存加快頁(yè)面訪問速度。同時(shí),作者會(huì)將開發(fā)過程中的一些截圖和代碼黏上去,提高閱讀效率。 備注:作者最近在學(xué)習(xí)github上別人的源碼時(shí),發(fā)現(xiàn)好多在計(jì)算一篇博客頁(yè)面訪問量view_count時(shí)都是這么做的:利用Laravel...
閱讀 1516·2021-10-11 10:59
閱讀 1892·2021-09-09 11:36
閱讀 1413·2019-08-30 15:55
閱讀 1333·2019-08-29 11:20
閱讀 3069·2019-08-26 13:39
閱讀 1473·2019-08-26 13:37
閱讀 1968·2019-08-26 12:11
閱讀 1332·2019-08-23 14:28