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');