字体:  

介绍一下Net::DNS编程中的缓存cache

ELM 发表于: 2006-12-03 16:12 来源: 榆树社区

Net::DNS是目前cpan里唯一较完整的dns实现库,可惜的是大部分是perl写的,速度较libresolv
等要慢不少。如何提高速度呢?尤其是对查询同样的结果。

以下是一段最简单的cache代码:

CODE:

package Net::DNS::Resolver;

my %cache;
sub search {
      my ($self, @args) = @_;
      if ($cache{@args}) {
          print "cached\n";
          return $cache{@args};
      } else {
          print "no cache...\n";
          $cache{@args} = $self->SUPER::search(@args)
      }
}
1;

use Net::DNS::Resolver;

my $dns = Net::DNS::Resolver->new;

for(0...10) {
    $dns->search('www.hzqbbc.com', 'A');
}
执行这段程序,会显示如下结果:

QUOTE:

no cache...
cached
cached
cached
cached
cached
cached
cached
cached
cached
cached
很显然,第二个循环执行时查询已经是返回缓存过的信息了。这样就可以提高速度,尤其是对大量
重复的查询有极大的提高作用。过去的APF server就是利用类似的原理cache dns结果的。

注意的是,这里重复定义了Net::DNS::Resolver,并覆盖了父类的search方法。但实际它还是
要调用父类的search方法,只不过增加了简单的cache机制。

此cache有一个大的问题,就是没有timeout/expire的机制,一旦cache就永远不会刷新,因此对
于长期运行的daemon程序,必须设置一个超时的机制,超过了时间就重新查询一次,以保持cache
的更新。

From: http://www.extmail.org/forum/read.php?tid=1230&fpage=2