首页 > 编程语言 >JAVA中DNS缓存设置(转)

JAVA中DNS缓存设置(转)

时间:2023-01-13 09:55:22浏览次数:53  
标签:www 缓存 JAVA cache 域名 DNS InetAddress

原文:https://blog.csdn.net/guanfengliang1988/article/details/92813431

作者:

我们上网的原点就是打开浏览器,在上方地址栏输入网址的那一刻,这个回车按了之后,发生了很多事情。首先,计算机只懂0和1,也就是说人类的字母网址计算机是不懂的,它只认识IP地址,如果是IPV4那就是4组8位的二进制数字。为了人类方便,需要有一个把网址翻译成IP地址的服务,就是DNS。其工作原理如图

 

这是一个高度简略的示意图,实际上DNS整个获取过程是被层层缓存的,一个DNS的获取并不一定都是从权威处获得的响应。再来一个复杂点的示意图:

 

Java DNS缓存

Java的网络应用程序的DNS缓存是由JVM的缓存策略控制的,当InetAddress类第一次使用某个域名(如www.google.com)创建InetAddress对象后,JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中。当下一次InetAddress类再使用这个域名时,就直接从DNS缓存里获得所需的信息,而无需再访问DNS服务器。

以获取一个域名www.jd.com对应的ip为例,其代码踪迹是这样的:

InetAddress.getByName(“www. XXX.com”)

InetAddress.getAllByName(“www. XXX.com”)[0]

InetAddress.getAllByName(“www. XXX.com”, null)

InetAddress.getAllByName0(“www. XXX.com”, null, true)

InetAddress.getCachedAddresses(“www. XXX.com”)
InetAddress. getCachedAddresses的源码如下

 

 

可以看到cache有两个,即有效DNS解析的cache(addressCache)和无效DNS解析的cache(negativeCache),为了让dns解析效率更高java很聪明的把dns解析正确的域名保存下来了,方便后续再查时能最快的返回结果;同时也缓存了无效的域名,因为根据DNS解析的原理,往往无效的域名解析耗时比正常的域名解析时间要长,所以缓存无效的域名可以有效的避免浪费时间在查找无效域名上,提升代码性能。下面是java.net.InetAddress$Cache的源码:

 

 

从上面的Cache类的get方法可以看到:

 

如果policy为0,那么cache的get方法就永远返回null,相当于cache不起作用了;

如果policy为-1,那么cache缓存过的entry永远都不会过期,也就是说就算域名对应的ip变了,cache再也不更新ip了

如果policy为n,根据“System.currentTimeMillis() + (policy * 1000)”,那么这个entry就可以在cache中存活n秒钟,即n秒后,该entry会被移除出cache

 

问题是policy怎么来的,看方法Cache.getPolicy()方法里面,主要是InetAddressCachePolicy类的get()和getNegative()方法。看sun.net.InetAddressCachePolicy类的源

 

 

一个是在java.security文件中配置networkaddress.cache.ttl=1111和networkaddress.cache.negative.ttl=2222

另一个是在启动参数中添加这两个参数-Dsun.net.inetaddr.ttl=1111和-Dsun.net.inetaddr.negative.ttl=2222

而且这两中配置方法有一个优先级,即第一种方法优先级高,但是第一种方法需要在打开Java中的SecurityManager,若没有打开则${java.home}/jre/lib/security/java.security文件的配置将不会生效

 

 

 

标签:www,缓存,JAVA,cache,域名,DNS,InetAddress
From: https://www.cnblogs.com/ajianbeyourself/p/17048633.html

相关文章

  • 来自StateOfJS调查:2022年JavaScript生态圈趋势报告(前端早读课)
    原文我这里记录些觉得有趣的。Promise.allSettled()完成所有输入的方法,nomatterwhat,返回对应的状态和值/原因,这对想知道所有返回状态的业务很好用;使用async/await没法......
  • JavaDoc
    JavaDocjavadoc命令是用来生成自己API文档的参数信息@author作者名@version版本号@since指明需要最早使用的jdk版本@param参数名@return返回值情况@thro......
  • 学习笔记——Mybatis中缓存机制
    2023-01-12一、Mybatis中缓存机制1、一级缓存(1)概述:一级缓存(即本地缓存或SqlSession级别缓存)(2)特点:①一级缓存默认开启②不能关闭③可以清空(3)缓存原理①当第一次获......
  • Java基础——异常处理
    异常概述所谓“程序”,就是按照次序,一步一步执行的指令;那么“异常”,就是程序没有按我们期待的次序执行时,程序给出的提示。在JAVA语言中,通过定义不同的异常类型,来提示不同......
  • JavaScript表单form
    form表单实例1<!DOCTYPEhtml>2<html>3<head>4<metacharset="utf-8">5<title>javascriptform表单</title>6</head>7......
  • 【转】用“逐步排除”的方法定位Java服务线上“系统性”故障
    一、摘要由于硬件问题、系统资源紧缺或者程序本身的BUG,Java服务在线上不可避免地会出现一些“系统性”故障,比如:服务性能明显下降、部分(或所有)接口超时或卡死等。其中部分......
  • 【参考答案】java基础练习:循环结构(while、do...while、for、break、continue、return
    while while实现:输出比i(i=5)小的正整数packagecom.qzcsbj;publicclassTest{publicstaticvoidmain(String[]args){inti=5;while(......
  • java猜数小游戏
    问题:程序自动生成一个1~100之间的随机数字,使用程序猜出这个数字是多少:Random可以随机生成一个随机数使用方法:导包创建对象Randomr=newRandom();//只有r是变......
  • 为什么我放弃Java,选择Kotlin(靠特灵)?
    今天查了一下,竟然发现Oracle的JDK听说是收费了。也就是说,你要用于生产环境的话,Oracle一旦查到你,你就要交钱的。我本身是个穷光蛋,哪还有钱交给Oracle。为了避免繁琐的法律制......
  • JavaScript 原型和原型链
    JavaScript是一种基于原型继承的语言。在JavaScript中,对象是通过原型链来继承属性和方法的。一、原型每一个对象都有一个proto属性,该属性指向该对象的原型。原型本......