我们有一个非常昂贵的计算需要缓存。因此,我们做了类似于以下操作:
my $result = $cache->get( $key );
unless ($result) {
$result = calculate( $key );
$cache->set( $key, $result, '10 minutes' );
}
return $result;
现在,在执行
calculate($key)
期间,在我们将结果存储在缓存中之前,会有其他几个请求同时开始运行calculate($key)
,因为许多进程都在计算相同的内容,所以系统性能受到影响。想法:让我们在缓存中放置一个标志,表示正在计算一个值,因此其他请求只需等待该计算完成,然后它们都可以使用它。类似于以下内容:
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;
现在这开启了一个全新的问题。如果 $$ 在设置缓存之前就死了呢?如果,如果...所有这些问题都是可以解决的,但由于 CPAN 中没有做到这一点(CPAN 中有关于 任何 事情的东西),我开始想:是否有更好的方法?例如,为什么 Perl 的
Cache
和 Cache::Cache
类不提供类似这样的机制?是否有一种可靠的模式可以使用?理想情况下,应该有一个已经在 squeeze 中打包的 CPAN 模块或一个突破口,让我看到我的错误... :-) 编辑:我后来了解到这被称为 缓存失效 并更新了问题的标题。