hefestoapicontainer

Caché

Hefesto ofrece varios niveles de caché: a nivel de nginx (URL completa), a nivel de Redis (lecturas HTTP) y a nivel de directivas (estáticos).

Cachear URLs completas (nginx)

Usa la directiva CacheUrl para que nginx almacene la respuesta de una URL. Es especialmente útil para endpoints GET que devuelven datos que cambian poco.

get /user/{id}:
  Connect:
    directive: DatabaseConnect
  FindUserById:
    directive: FindUserById
    userId: $.message.pathParam.id
    target: user
  ModifyMessage:
    directive: ModifyMessage
    body: $.memory.user
    headers:
      Content-Type: application/json
  Cache:
    directive: CacheUrl
    expirationMinutes: 120

La primera vez que se consulta el endpoint, se ejecutan todas las directivas (consulta a BD). La respuesta queda cacheada en nginx. Las siguientes peticiones son servidas directamente por nginx sin ejecutar las directivas.

Para limpiar toda la caché de nginx:

cd hefesto-server/scripts/
./cache-flush.sh

CacheDisabled

La directiva CacheDisabled elimina las cabeceras de caché de la respuesta. Se usa normalmente en el before para garantizar que ningún endpoint cachee sus respuestas por defecto:

before:
  CacheDisabled:
    directive: CacheDisabled

Luego, en los endpoints concretos donde se desee caché, se usa CacheUrlpara habilitarla.

Cachear lecturas HTTP (Pull + Redis)

La directiva Pull acepta un parámetro cache en segundos. Cuando se usa, la respuesta se guarda en Redis y se reutiliza sin hacer la petición HTTP real.

get /provinces:
  GetProvinces:
    directive: Pull
    host: $.memory.hefesto-localhost
    path: /geo-bike-routes/provinces
    target: provinces
    cache: 31536000  # 1 año en segundos

La clave de caché se genera automáticamente a partir del host, path, headers, queryParams y body, por lo que dos peticiones con distintos parámetros no comparten caché.

Cachear cualquier dato en Redis

Para cachear cualquier fragmento de información, usa las directivas RedisSet / RedisGet:

// Guardar en caché
RedisSet::run($state, [
    'key' => 'mykey',
    'value' => ['data' => 'mi información'],
    'expire' => 3600
]);

// Leer de caché
RedisGet::run($state, [
    'key' => 'mykey',
    'target' => 'myData'
]);
$data = $state->memory()->get('myData');