Respuestas: Caché de resultados

https://elbauldelprogramador.com/buenas-practicas-para-el-diseno-de-una-api-restful-pragmatica/#20-cacheo

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?