Respuestas: Caché de resultados
Haciendo un caché de resultados de la API, se mantiene el estado de las respuestas con una cantidad de tiempo determinado y así reducir la carga sobre la DB.
Sistema de caché y parámetros de la URL
Se deben considerar los parámetros como parte de la url del sistema que permite determinar cuando cachear. Es importante saber que los parámetros no tienen un orden específico en la url y la respuesta debe ser la misma para cualquier orden sin necesidad de generarse una nueva instancia de caché.
Esto implica que se deben considerar los parámetros de url y ordenarlos para que independientemente de cómo sean enviados por el usuario para el sistema sean siempre los mismos.
use Illuminate\Support\Facades\Cache;
protected function cacheResponse($data) // the parameter is not a collection instance because transformData
{ // returns an array not a collection
// current url
$url = request()->url(); // used check if is needed to create a new cache or use an existing one
// get url parameters
$queryParams = request()->query();
// order array according to key
ksort($queryParams); // not needed assignment, operates by reference not by value
// build query string
$queryString = http_build_query($queryParams);
$fullUrl = "{$url}?{$queryString}";
$seconds = 30/60; // 30 seconds
return Cache::remember($fullUrl, $seconds, function() use($data) {
return $data; // return data to be added to cache
});
}
protected function showAll(Collection $collection, $code = 200)
{
// check if collection is empty
if($collection->isEmpty())
{
return $this->successResponse(['data' => $collection], $code);
}
$transformer = $collection->first()->transformer;
// filter before sorting
$collection = $this->filterData($collection, $transformer);
// sort by --> executed before transformer because that function returns a fractal instance not a collection
$collection = $this->sortData($collection, $transformer);
$collection = $this->paginate($collection);
$collection = $this->transformData($collection, $transformer); // fractal adds by default 'data', is not needed to specify it
$collection = $this->cacheResponse($collection);
return $this->successResponse($collection, $code);
}
Si hacemos una petición de la lista de usuarios y a continuación eliminamos alguno, al pedir la lista nuevamente (dentro del tiempo establecido en la creación del caché) obtendremos la misma lista que al principio, esto sucede porque durante ese tiempo el sistema no consulta a la DB sino a un archivo o sistema de caché a consultar.
Luego de transcurrido el tiempo fijado, en este caso los 30 segundos, obtendremos la lista actualizada

Nota: funciona también para peticiones con parámetros en la url
Last updated
Was this helpful?