Abbiamo un calcolo molto costoso che vorremmo memorizzare nella cache. Così facciamo qualcosa di simile a:Caching & avoiding Cache Stampedes - più calcoli simultanei
my $result = $cache->get($key);
unless ($result) {
$result = calculate($key);
$cache->set($key, $result, '10 minutes');
}
return $result;
Ora, durante calculate($key)
, prima di memorizzare il risultato in cache, numerose altre richieste arrivano, che iniziano in corso anche calculate($key)
, e le prestazioni del sistema soffre perché molti processi sono tutti calcolando la stessa cosa.
Idea: Consente di inserire nella cache un flag per il calcolo di un valore, in modo che le altre richieste attenderanno il completamento di quel calcolo, in modo che tutti lo usino. Qualcosa di simile:
my $result = $cache->get($key);
if ($result) {
while ($result =~ /Wait, \d+ is running calculate../) {
sleep 0.5;
$result = $cache->get($key);
}
} else {
$cache->set($key, "Wait, $$ is running calculate()", '10 minutes');
$result = calculate($key);
$cache->set($key, $result, '10 minutes');
}
return $result;
Ora che apre una lattina di vermi completamente nuova. Cosa succede se $$ muore prima di impostare la cache. Che cosa succede se, se ... Tutti loro risolvibile, ma poiché non v'è nulla in CPAN che fa questo (c'è qualcosa in CPAN per tutto), comincio a chiedermi:
Esiste un approccio migliore? C'è una ragione particolare, ad es. Le classi Perl Cache
e Cache::Cache
non forniscono alcun meccanismo come questo? C'è un modello provato e vero che potrei usare invece?
ideale sarebbe un modulo CPAN con un pacchetto debian già in compressione o un momento eureka, dove vedo l'errore dei miei modi ... :-)
EDIT: allora ho imparato che questo si chiama a Cache stampede e hanno aggiornato il titolo della domanda.
[IPC :: ShareLite] (http://search.cpan.org/~andya/IPC-ShareLite-0.17/lib/IPC/ShareLite.pm) fornisce l'interfaccia OO per SysV memoria condivisa. È simile a ** Cache ** che fornisce un lock esclusivo. – tuxuday
Esiste un [Cache stampede - articolo di Wikipedia] (https://en.wikipedia.org/wiki/Cache_stampede) e un [Perl-Cache Discuss> che evita l'argomento Stampedes] (https://groups.google.com/d/topic/perl-cache-discuss/jDdBQliwlP4/discussione) sulle strategie per questo. –
E c'è una strategia [djangosnippets: MintCache] (https://www.djangosnippets.org/snippets/155/). –