我正在构建测试爬虫,并想知道Go(golang)是否缓存DNS查询。我在dnsclient中没有看到任何关于缓存的内容。这似乎是添加到任何爬虫以防止大量额外DNS查询的重要事情。
Go(1.4+)是否缓存DNS查找?
如果没有,debian / ubuntu / linux,windows或darwin / OSX是否在网络级别进行任何缓存从中受益?
答案 0 :(得分:9)
你的问题的答案是否定的。 std lib解析器中没有内置的dns缓存。会有帮助吗?也许在某些情况下。我们的组织在每个服务器上运行本地dns缓存,并在那里指向resolv.conf。因此,使用该语言进行缓存不一定有助于我们。
有一些解决方案可以帮助您。 This package似乎有一个很好的解决方案。从他们自述的片段中你甚至可以做到:
http.DefaultClient.Transport = &http.Transport {
MaxIdleConnsPerHost: 64,
Dial: func(network string, address string) (net.Conn, error) {
separator := strings.LastIndex(address, ":")
ip, _ := dnscache.FetchString(address[:separator])
return net.Dial("tcp", ip + address[separator:])
},
}
为来自http.Get
和朋友的所有http请求启用它。
答案 1 :(得分:2)
Go解析器不执行任何进程内缓存。虽然可以自己动手,但最好的办法是在每台机器上运行系统范围的DNS缓存。 (我最喜欢的是dnsmasq。)