Dog -Piling:缓存失效遇上大量访问

来源:互联网 发布:支付宝能解绑淘宝号码 编辑:程序博客网 时间:2024/05/19 05:29

Dog-Piling是指当缓存中的数据失效时,遇到大量的请求,此时大量的请求涌向数据库,导则数据库超负荷。(数据获取的时间大于服务器需要响应的用户的时间)

Dog-Piling与cache stampede和thundering herd同义。

一种避免dog-piling效应的旧解决方案:

首先定义以下变量:

my $STALE_REFRESH = 1;
my $STALE_CREATED = 2;
my $EXPIRY = 300;
my $GENERATION_TIME = 30;


sub memcGet{
    my($this,$key,$db_get_method,$db_method_args,$expiry,$generation_time) = @_;
$expiry = $EXPIRY unless defined $expiry;
$generation_time = $GENERATION unless defined $generation_time;
return $this->{memc}->get($key) unless $expiry;

my $full_expiry = $expiry + $generation_time*2;

my $stale_key = "$key:stale";
my $value = $this->{memc}->get($key);
my $stale_value = $this->{memc}->get($stale_key);
unless(defined $stale_value){
   $this->{memc}-set($stale_key,$STALE_REFRESH,$generation_time);
print "SETTING stale_value";
$value = undef;
}

unless(defined $value){
   $value = $db_get_method->($this,$db_method_args);
$this->{memc}->set($key,$value,$full_expiry);
$this->{memc}->set($stale_key,$STALE_VALUE,$expiry);
}
return $value;
}

下面是一些详细介绍Dog-Piling的文章。

Strategy: Break Up The Memcache Dog Pile

http://highscalability.com/blog/2009/8/7/strategy-break-up-the-memcache-dog-pile.html

MintCache:

http://taoyh163.blog.163.com/blog/static/19580356200812564641602/

Dog-pile Effect and How to Avoid it with Ruby on Rails memcache-client Patch:

http://kovyrin.net/2008/03/10/dog-pile-effect-and-how-to-avoid-it-with-ruby-on-rails-memcache-client-patch/