【发布时间】:2016-09-05 21:01:18
【问题描述】:
我正在研究 Halo 5 API。我申请了更高的 API 速率限制,我得到的回复之一是:
您能否向我们提供更多详细信息,说明您对 API 进行了哪些调用,以及您是否使用了任何缓存?具体来说,我们建议缓存匹配和事件详细信息以及元数据,因为它们很少更改。
当他们说“你在打哪个电话”时,我得到了这个部分,但缓存部分,我从未使用过。我了解了缓存的基本部分,它可以加速您的 API,但我只是不知道如何在我的 API 中实现它。
我想知道如何在我的应用中缓存一些数据。这是我如何从 API 获得玩家奖牌的基本示例。
路线:
Route::group(['middleware' => ['web']], function () {
/** Get the Home Page **/
Route::get('/', 'HomeController@index');
/** Loads ALL the player stats, (including Medals, for this example) **/
Route::post('/Player/Stats', [
'as' => 'player-stats',
'uses' => 'StatsController@index'
]);
});
我的 GetDataController 调用 API Header 来获取玩家奖牌:
<?php
namespace App\Http\Controllers\GetData;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\UriInterface;
use GuzzleHttp;
use App\Http\Controllers\Controller;
class GetDataController extends Controller {
/**
* Fetch a Players Arena Stats
*
* @param $gamertag
* @return mixed
*/
public function getPlayerArenaStats($gamertag) {
$client = new GuzzleHttp\Client();
$baseURL = 'https://www.haloapi.com/stats/h5/servicerecords/arena?players=' . $gamertag;
$res = $client->request('GET', $baseURL, [
'headers' => [
'Ocp-Apim-Subscription-Key' => env('Ocp-Apim-Subscription-Key')
]
]);
if ($res->getStatusCode() == 200) {
return $result = json_decode($res->getBody());
} elseif ($res->getStatusCode() == 404) {
return $result = redirect()->route('/');
}
return $res;
}
}
我的 MedalController 从玩家那里获得奖牌:
<?php
namespace App\Http\Controllers;
use GuzzleHttp;
use App\Http\Controllers\Controller;
class MedalController extends Controller {
public function getArenaMedals($playerArenaMedalStats) {
$results = collect($playerArenaMedalStats->Results[0]->Result->ArenaStats->MedalAwards);
$array = $results->sortByDesc('Count')->map(function ($item, $key) {
return [
'MedalId' => $item->MedalId,
'Count' => $item->Count,
];
});
return $array;
}
}
这是显示玩家奖牌的功能:
public function index(Request $request) {
// Validate Gamer-tag
$this->validate($request, [
'gamertag' => 'required|max:16|min:1',
]);
// Get the Gamer-tag inserted into search bar
$gamertag = Input::get('gamertag');
// Get Players Medal Stats for Arena
$playerArenaMedalStats = app('App\Http\Controllers\GetData\GetDataController')->getPlayerArenaStats($gamertag);
$playerArenaMedalStatsArray = app('App\Http\Controllers\MedalController')->getArenaMedals($playerArenaMedalStats);
$arenaMedals = json_decode($playerArenaMedalStatsArray, true);
return view('player.stats')
->with('arenaMedals', $arenaMedals)
}
你们知道如何缓存这些数据吗?
(仅供参考,JSON 调用中大约有 189 个不同的奖牌,因此它是一个相当大的 API 调用)。我还阅读了有关 Laravel 缓存的文档,但仍需要澄清。
【问题讨论】:
-
使用 redis 之类的东西,甚至是 laravel 中的默认缓存系统,您应该能够将结果缓存大约 5-10 分钟,并且显着减少了 api 调用。基本上,您使用类似于会话的
Cache类。创建一个键/值对并让它在一定时间后过期。 laravel.com/docs/5.1/cache -
我已阅读文档,但我不明白我会在哪里执行此操作:创建一个键/值对并让它在一定时间后过期