Tenemos un cálculo muy caro que nos gustaría almacenar en caché. Por lo que hacemos algo similar a:Almacenamiento en caché y prevención de estampillas de caché: múltiples cálculos simultáneos
my $result = $cache->get($key);
unless ($result) {
$result = calculate($key);
$cache->set($key, $result, '10 minutes');
}
return $result;
Ahora, durante calculate($key)
, antes de almacenar el resultado en la memoria caché, varias otras solicitudes de entrar, para que también empiezan a correr calculate($key)
, y el rendimiento del sistema debido a que muchos procesos están calculando la misma cosa.
Idea: Permite poner un indicador en el caché de que se está calculando un valor, por lo que las demás solicitudes simplemente esperan a que termine ese cálculo, para que todos lo usen. Algo así como:
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;
Ahora que se abre toda una nueva lata de gusanos. Qué sucede si $$ muere antes de establecer la caché. ¿Qué pasa si, ¿qué pasaría si ... Todos ellos solucionable, pero ya que no hay nada en CPAN que hace esto (hay algo en CPAN para todo ), que comienza a preguntarse:
¿Hay un mejor enfoque? ¿Hay alguna razón en particular, por ejemplo, Las clases Cache
y Cache::Cache
de Perl no proporcionan algún mecanismo como este? ¿Hay un patrón probado y verdadero que podría usar en su lugar?
ideal sería un módulo de CPAN con un paquete Debian que ya están en contracción o un momento eureka, donde veo el error de mis maneras ... :-)
EDIT: he sabido que esto se llama a Cache stampede y ha actualizado el título de la pregunta.
[IPC :: ShareLite] (http://search.cpan.org/~andya/IPC-ShareLite-0.17/lib/IPC/ShareLite.pm) proporciona interfaz OO para SysV memoria compartida. Es similar a ** Cache ** que proporciona un bloqueo exclusivo. Hay una – tuxuday
[estampida caché - artículo de Wikipedia] (https://en.wikipedia.org/wiki/Cache_stampede) y una [Perl-caché Discuta> evitar estampidas tema] (https://groups.google.com/d/topic/perl-cache-discuss/jDdBQliwlP4/discussion) sobre estrategias para esto. –
Y hay una [djangosnippets: MintCache] estrategia (https://www.djangosnippets.org/snippets/155/). –