加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 缓存和避免缓存踩踏 – 多个同时计算

发布时间:2020-12-15 21:57:12 所属栏目:大数据 来源:网络整理
导读:我们有一个非常昂贵的计算,我们想缓存.所以我们做类似的事情: my $result = $cache-get( $key );unless ($result) { $result = calculate( $key ); $cache-set( $key,$result,'10 minutes' );}return $result; 现在,在calculate($key)期间,在我们将结果存储
我们有一个非常昂贵的计算,我们想缓存.所以我们做类似的事情:
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,'10 minutes' );
}


return $result;

现在,它开辟了一整套新的蠕虫.如果$$在设置缓存之前死亡,该怎么办?如果……如果…它们都可以解决,但由于CPAN中没有任何内容可以解决这个问题(CPAN中有一些东西可用),我开始想知道:

有更好的方法吗?是否有特殊原因,例如Perl的Cache和Cache :: Cache类不提供这样的机制吗?我可以使用一种经过验证的真实模式吗?

理想的是一个CPAN模块,debian包已经处于挤压或尤里卡时刻,在那里我看到了我的方式错误……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读