Cache Service overzicht
De Cache Service biedt een tijdelijke sleutel-waarde store die scripts aanzienlijk kan versnellen. Het is ideaal voor het cachen van externe API-resultaten, zware berekeningen en configuratiedata die niet bij elke uitvoering opnieuw opgehaald hoeft te worden.
Er zijn drie cache-typen:
- Script cache: gedeeld door alle gebruikers van het script.
- Document cache: gedeeld door alle gebruikers in het huidige document.
- User cache: privé per gebruiker.
const scriptCache = CacheService.getScriptCache();
const docCache = CacheService.getDocumentCache();
const userCache = CacheService.getUserCache();
Basis caching-patroon
function haalDataOpMetCache(key) {
const cache = CacheService.getScriptCache();
const gecached = cache.get(key);
if (gecached) {
Logger.log('Cache hit voor: ' + key);
return JSON.parse(gecached);
}
Logger.log('Cache miss, data ophalen...');
const data = haalDataOpVanBron(key);
cache.put(key, JSON.stringify(data), 3600);
return data;
}
function haalDataOpVanBron(key) {
const response = UrlFetchApp.fetch(`https://api.voorbeeld.nl/data/${key}`);
return JSON.parse(response.getContentText());
}
Bulk-caching met putAll en getAll
Met putAll() en getAll() schrijf en lees je meerdere sleutels in een enkele aanroep. Dat is sneller dan een lus met losse put()- en get()-aanroepen.
function cacheMeerderItemsInEenKeer() {
const cache = CacheService.getScriptCache();
const items = {
'config_versie': '2.1.0',
'max_rijen': '500',
'api_endpoint': 'https://api.voorbeeld.nl/v2',
'timeout_sec': '30',
};
cache.putAll(items, 7200);
const sleutels = ['config_versie', 'max_rijen', 'api_endpoint'];
const resultaten = cache.getAll(sleutels);
Object.entries(resultaten).forEach(([k, v]) => {
Logger.log(`${k}: ${v || '(niet gecached)'}`);
});
}
Cache-waarden zijn altijd strings
Cache-waarden moeten strings zijn. Gebruik JSON.stringify() voor objecten en arrays, en JSON.parse() bij het ophalen. De maximale waardegrootte is 100 KB per sleutel en een sleutel mag maximaal 250 tekens lang zijn.
Cache invalideren
function verwijderCacheItems() {
const cache = CacheService.getScriptCache();
cache.remove('config_versie');
cache.removeAll(['max_rijen', 'api_endpoint', 'timeout_sec']);
Logger.log('Cache geleegd');
}
Configuratie cachen
Een veelgebruikt patroon is om configuratie uit een Spreadsheet eenmalig in te lezen en daarna te cachen. Zo voorkom je dat elke uitvoering opnieuw de hele sheet uitleest.
function getConfig() {
const cache = CacheService.getScriptCache();
const cacheKey = 'app_config';
const gecachede = cache.get(cacheKey);
if (gecachede) {
return JSON.parse(gecachede);
}
const blad = SpreadsheetApp.openById('CONFIG_SHEET_ID').getSheetByName('Config');
const data = blad.getDataRange().getValues();
const config = {};
data.forEach(rij => {
if (rij[0] && rij[1]) {
config[rij[0]] = rij[1];
}
});
cache.put(cacheKey, JSON.stringify(config), 1800);
return config;
}
API-resultaten cachen
Externe API's hebben vaak hun eigen rate limits en kosten. Door resultaten kort te cachen verminder je het aantal verzoeken en blijf je binnen het Apps Script-quotum voor UrlFetchApp.
function haalWeersdata(stad) {
const cache = CacheService.getScriptCache();
const key = `weer_${stad.toLowerCase().replace(/\s/g, '_')}`;
const gecached = cache.get(key);
if (gecached) {
return JSON.parse(gecached);
}
const props = PropertiesService.getScriptProperties();
const apiKey = props.getProperty('WEATHER_API_KEY');
const url = `https://api.openweathermap.org/data/2.5/weather?q=${encodeURIComponent(stad)}&appid=${apiKey}&units=metric&lang=nl`;
const response = UrlFetchApp.fetch(url);
const data = JSON.parse(response.getContentText());
cache.put(key, JSON.stringify(data), 600);
return data;
}
Bewaar geen geheimen in de cache
Sla nooit API-sleutels, wachtwoorden of tokens op in de Cache Service. Gebruik daarvoor de PropertiesService (script properties). Bedenk ook dat de script cache gedeeld is door alle gebruikers van het script: cache geen persoonsgegevens in de script cache, gebruik daarvoor de user cache.
Cache-first strategie voor een externe API
- Bepaal een consistente cache-sleutel op basis van de queryparameters.
- Controleer de cache met
cache.get(key). - Bij een cache hit: parse de JSON en retourneer direct.
- Bij een cache miss: roep de externe API aan met
UrlFetchApp.fetch(). - Sla het resultaat op met
cache.put(key, JSON.stringify(data), ttl). - Retourneer de data.
Combineer Cache en Properties
Gebruik een gelaagde aanpak: bewaar stabiele configuratie in PropertiesService (persistent) en cache afgeleide of dure resultaten in de Cache Service (snel maar tijdelijk). Schrijf je get()-code altijd zo dat een lege cache geen fout veroorzaakt, maar gewoon de bron opnieuw aanroept.
Hoe lang kan ik data in de cache bewaren?
Maximaal 21600 seconden, dat is 6 uur. De minimale bewaartijd is 1 seconde en de standaard is 600 seconden (10 minuten). Waarden kunnen eerder vervallen als de cache vol raakt.
Is de cache persistent bij server-herstarts?
Nee, de cache is vluchtig. Als de Google-infrastructuur de cache leegt, retourneert cache.get() de waarde null. Schrijf je code daarom altijd zo dat een cache miss netjes wordt afgehandeld.
Kan ik binaire data cachen?
Nee, alleen strings. Codeer binaire data eerst met Utilities.base64Encode() en decodeer het bij ophalen met Utilities.base64Decode(). Let op de limiet van 100 KB per sleutel.
Wat is het verschil tussen Cache Service en Properties Service?
Properties Service is persistent en blijft altijd bestaan, terwijl Cache Service tijdelijk maar sneller is. Gebruik Properties voor configuratie en geheimen, en Cache voor tijdelijke prestatieoptimalisatie.
Welk cache-type moet ik kiezen?
Gebruik de script cache voor data die voor alle gebruikers hetzelfde is, de document cache voor data die bij een specifiek document hoort, en de user cache voor persoonlijke of gevoelige data per gebruiker.
Hoeveel sleutels kan ik bewaren?
De Cache Service is bedoeld voor snelle, beperkte opslag en niet als database. Houd de sleutels en waarden compact, want elke waarde mag maximaal 100 KB groot zijn en oude items kunnen worden verdrongen wanneer de cache vol is.
De Cache Service is een eenvoudige maar krachtige tool om quota-verbruik te verminderen en scripts sneller te maken. Combineer het met PropertiesService voor een gelaagde caching-strategie die zowel snel als betrouwbaar is.