缓存是web开发的重要组成部分,相信很多人和我一样,经常忽略这个问题。随着工作经验的积累,我已经意识到缓存的重要性,这里我通过Scotch来说明它的重要性。通过观察,发现Scotch每天都按照计划发布文章。但是,新文章不会在上次发表文章后的24小时内发布。因此,着陆页上的数据将在24小时内保持不变。换句话说,在24小时(更准确地说是22-23小时)内向数据库请求文章数据是没有意义的。缓存可以很好的解决这个问题。当遇到页面请求时,我们可以将结果缓存22小时。只要控制器在这段时间内请求的数据是缓存中的数据,就会一直存在,直到缓存超时。下面先来看看缓存在Laravel中的基本用法,再通过一个简单的例子来看看缓存能带来多大的加速。Laravel中缓存的基本使用Laravel可以很方便的让我们转换我们想要生成缓存的方式。我们可以很容易地修改缓存驱动程序。去config/cache.php看看可用的驱动:apcarraydatabasefilememcachedredis你可以修改.env文件中的缓存驱动:CACHE_DRIVER=file你可以一直尝试修改它们而不用担心配置,因为它的默认驱动是文件。Cachefacade公开了许多静态方法来创建、更新、获取、删除和检查缓存内容的存在。在构建演示应用程序之前,让我们先看看这些方法。创建/更新缓存值我们使用put()方法来添加或更新缓存值。该方法必须使用3个参数:键名和键值过期时间单位分钟例如:Cache::put('key','value',10);键名是缓存的唯一标识,用于在需要时获取值。此外,我们还可以使用remember()方法来自动获取和更新缓存值。该方法首先检查键名是否存在,如果创建则返回结果。否则它会创建一个新键并将闭包的结果分配给它,如下所示:Cache::remember('articles',15,function(){returnArticle::all();});参数15是缓存的分钟数。这样,我们甚至根本不必检查缓存是否过期。Laravel不仅会为我们处理这些事情,而且它会在我们没有明确告诉它如何去做的情况下获取或重新生成缓存。取回缓存值缓存的值可以通过get()方法获取。此方法接受参数键:Cache::get('key');检查key是否存在,有时在更新或者获取缓存值之前判断缓存key是否存在是非常必要的,可以使用has()方法实现:if(Cache::has('key')){Cache::get('key');}else{Cache::put('key',$values,10);}删除缓存值删除缓存值可以使用forget()方法,传入key作为参数删除:Cache::forget('key');我们还可以检索缓存值并将其删除。我喜欢称其为一次性缓存:$articles=Cache::pull('key');我们也可以使用如下命令在缓存过期前清除所有缓存:phpartisancache:clear这里举例一个简单的演示主要是为了说明是否使用缓存对请求响应所需时间的影响。为了让大家更直观的理解,建议大家按照教程自己搭建一个Laravel实例。模型和表迁移使用如下命令创建文章模型:phpartisanmake:modelArticle-m-m参数会自动创建一个迁移,所以不需要使用createmigration命令。此命令将创建App/Article.php和database/migrations/xxxx_xx_xx_xxxxxx_create_articles_table.php文件。修改迁移文件并添加以下两行:publicfunctionup(){Schema::create('articles',function(Blueprint$table){$table->increments('id');//添加以下内容$table->string("title");$table->string("content");$table->timestamps();});}然后我们可以使用以下命令迁移我们的数据库:phpartisanmigratefillDatabaseNext,我们需要填写文章的数据库表。在database/seeds/DatabaseSeeder.php中修改run()如下:publicfunctionrun(){Model::unguard();//使用faker库模拟一些数据$faker=Faker::create();//创建30篇文章foreach(range(1,30)as$index){Article::create(['title'=>$faker->sentence(5),'content'=>$faker->paragraph(6)]);}Model::reguard();}Laravel包含Faker库来快速生成假数据,我们可以使用PHP的range()方法生成30个假数据。接下来,我们可以使用这个artisan命令填充数据库:phpartisandb:seed创建文章控制器接下来,我们可以创建一个处理请求和缓存的控制器,首先它是空的:phpartisanmake:controllerArticlesController...然后我们添加一个路由app/Http/routes.php指向这篇文章控制器的索引方法:Route::group(['prefix'=>'api'],function(){Route::get('articles','ArticlesController@指数');});现在我们的数据库已经设置了样本数据,我们可以测试它了。没有缓存的响应看看我们传统的controller方法是什么样子的,没有缓存,处理响应需要多长时间,在index()方法中,返回文章的资源数据:publicfunctionindex(){$articles=Articles::全部();returnresponse()->json($articles);}也可以使用Postman请求(http://localhost/api/articles)或者直接用浏览器打开,可以看下图。请注意此请求在您的本地开发服务器上完成所需的时间。从缓存返回的响应现在让我们尝试使用缓存,看看数据响应所需的时间是否有显着差异。Modifytheindex()methodas:publicfunctionindex(){$articles=Cache::remember('articles',22*60,function(){returnArticle::all();});returnresponse()->json($articles);}Nowweusetheremember()methodtocachethearticle,thecachetimeis22hours,runitagainandobservethetimeittakes,youcanseemyscreenshot:ResultsandrecommendationsTestedinmystandarddevelopmentenvironment得出,使用缓存时产生响应所需的时间比没有使用的时候要少:未使用缓存ServerHitsTime1st4478ms2nd4232ms3rd2832ms4th3428msAvg3742ms使用缓存(File驱动)ServerHitsTime1st4255ms2nd3182ms3rd2802ms4th3626msAvg3466ms使用缓存(Memcached驱动)ServerHitsTime1st3626ms2nd566ms3rd1462ms4th1978msAvg1908ms?:)使用缓存(Redis驱动)这里Needtoinstallpredis/predispackageServerHitsTime1st3549ms2nd1612ms3rd920ms4th575msAvg1664msthroughcomposer:)Isn'titcool?Therearetwopointstonotehere:Evenwithcaching,theresponsetothefirstrequeststilltakesmoretime,becausethecacheisstillemptywhenthefirstrequestismade.Comparedwiththefiledriver,MemcachedandRedisarefaster,soitisrecommendedtouseanexternalcachedriverwhentheprojectislarge.ConclusionUsingfilesanddatabasesasdrivers,thereisnoobviousdifferenceinspeedbetweenthetwo.Butifweuseathird-partyserviceasadriver,wecanobviouslyseeaperformanceimprovement.Soinvestinginacacheisworthit.FormoremodernPHPknowledge,pleasejointhePHP/Laravelknowledgecommunitytolearnandgrowtogether.
