JDK中DNS缓存的分析

在JAVA中使用InetAddress.getByName(String host) 方法来获取给定hostname的IP地址。为了减少DNS解析的请求次数,提高解析效率,InetAddress中提供cache来缓存解析结果。

下面就此cache进行简单的分析:

该缓存实现比较简单,巧妙的利用LinkedHashMap的特性来进行过期条目的检测和移除。

    /*** Represents a cache entry*/static final class CacheEntry {CacheEntry(Object address, long expiration) {this.address = address;this.expiration = expiration;}Object address;long expiration;}//CacheEntry实例代表一个缓存记录,一个记录中包括address(IP 地址) 和 expiration/*** A cache that manages entries based on a policy specified* at creation time.*/static final class Cache {private LinkedHashMap cache;private Type type;enum Type {Positive, Negative};//此缓存只提供两种缓存类型 Positive: DNS解析成功    Negative:DNS解析失败/*** Create cache*/public Cache(Type type) {this.type = type;cache = new LinkedHashMap();//LinkedHashMap 保存了记录的插入顺序,当遍历LindedHashMap时得到的数据是最先插入的数据,此特性很重要在put方法中有所体现}private int getPolicy() {//获取配置的缓存策略   0: 不缓存  -1: 代表永久缓存  >=1:代表缓存的时间(unit: second)if (type == Type.Positive) {return InetAddressCachePolicy.get();} else {return InetAddressCachePolicy.getNegative();}}/*** Add an entry to the cache. If there's already an* entry then for this host then the entry will be* replaced.*/public Cache put(String host, Object address) {int policy = getPolicy();if (policy == InetAddressCachePolicy.NEVER) {return this;}// purge any expired entriesif (policy != InetAddressCachePolicy.FOREVER) {// As we iterate in insertion order we can// terminate when a non-expired entry is found.LinkedList expired = new LinkedList();Iterator i = cache.keySet().iterator();//每次put的时候都对缓存记录做一个清理,由于每个条目的过期时间是一样的,所以先插入的记录就先到期long now = System.currentTimeMillis();while (i.hasNext()) {String key = (String)i.next();CacheEntry entry = (CacheEntry)cache.get(key);if (entry.expiration >= 0 && entry.expiration < now) {expired.add(key);} else {break;}}i = expired.iterator();while (i.hasNext()) {cache.remove(i.next());}}// create new entry and add it to the cache// -- as a HashMap replaces existing entries we//    don't need to explicitly check if there is//    already an entry for this host.long expiration;if (policy == InetAddressCachePolicy.FOREVER) {expiration = -1;} else {expiration = System.currentTimeMillis() + (policy * 1000);}CacheEntry entry = new CacheEntry(address, expiration);cache.put(host, entry);return this;}/*** Query the cache for the specific host. If found then* return its CacheEntry, or null if not found.*/public CacheEntry get(String host) {int policy = getPolicy();if (policy == InetAddressCachePolicy.NEVER) {return null;}CacheEntry entry = (CacheEntry)cache.get(host);// check if entry has expiredif (entry != null && policy != InetAddressCachePolicy.FOREVER) {//命中缓存条目后先判断是否过期if (entry.expiration >= 0 &&entry.expiration < System.currentTimeMillis()) {cache.remove(host);entry = null;}}return entry;}}

 

转载于:https://www.cnblogs.com/cruze/p/3707011.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

了解开源文化

开放源码软件运动是计算机科学领域的一种文化现象&#xff0c;源自***对智慧成果共享、自由的追求。开源运动发展到现在&#xff0c;这种能够积极促进人类文明发展的文化已经***到信息、教育、健康等领域&#xff0c;融入了哲学范畴。开放源码运动的史前史包括了整个Unix&#…

jquery验证手机号码和邮箱地址例子

为什么80%的码农都做不了架构师&#xff1f;>>> //jquery验证邮箱 function checkSubmitEmail(){ if($("#email").val()""){ $("#confirmMsg").html("邮箱地址不能为空&#xff01;"); $("#email").focus()…

.NET 6新特性试用 | 可写JSON DOM API

前言我们常用JSON的方式&#xff0c;是将类对象序列化/反序列化:var user new User { Name "My IO" }; var json JsonSerializer.Serialize(user); var newUser JsonSerializer.Deserialize<User>(json);而通过System.Text.Json提供的可写JSON DOM API&…

网页设计的css样式,网页设计引入CSS样式的五种方式_css

一、使用STYLE属性将STYLE属性直接加在个别的元件标签里&#xff0c;&#xff1c;元件(标签) STYLE”性质(属性)1: 设定值1; 性质(属性)2: 设定值2; …}例如&#xff1a;&#xff1c;TD STYLE”COLOR:BLUE; font-size:9pt; font-family:”标楷体”; line-height:150%&#xff1…

C#薪水和前途

这1&#xff0c;2年有更新简历&#xff0c;一直在看市场行情&#xff0c;最近这么多年在聊C#的薪水&#xff0c;我也说说我看到的情况&#xff0c;只限上海&#xff1b; 仅供大家参考&#xff1b; 高端职位&#xff1a; 纯技术&#xff0c;不谈管理&#xff0c; 一般是架构师职…

Heritrix 3.1.0 源码解析(十一)

上文分析了Heritrix3.1.0系统是怎么添加CrawlURI curi对象的&#xff0c;那么在系统初始化的时候&#xff0c;是怎么载入CrawlURI curi种子的呢&#xff1f; 我们回顾前面的文章&#xff0c;在我们执行采集任务的launch指令的时候&#xff0c;实际会调用CrawlController对象的v…

令人难忘的初吻描写......

1 我可以把你删了吗&#xff0c;我没有内存了&#xff08;via.豆瓣陈皮&#xff0c;侵删&#xff09;▼2 黑社会平时都在干些什么&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 老师头秃是有原因的▼4 是谁炸了珍珠港&#xff1f;&#xff08;素材来源网络&…

Android之获取应用程序(包)的大小-----PackageManager的使用(二)

http://blog.csdn.net/qinjuning/article/details/6892054 通过第一部分 << Android中获取应用程序(包)的信息-----PackageManager的使用(一) >>的介绍&#xff0c;对PackageManager以及 AndroidManife.xml定义的节点信息类XXXInfo类都有了一定的认识。 本部分的内…

eclipse创建maven多模块项目(单个类似)

2019独角兽企业重金招聘Python工程师标准>>> 1、下载安装maven 1.1、下载 注意&#xff1a;maven的版本&#xff0c;要根据你的jdk版本来下载。要不会安装失败&#xff0c;提示版本问题哦 Jdk 对应的maven版本如图:&#xff08;官网地址&#xff1a;http://maven.ap…

如何通过 C# 判断一个 路径 是本机还是远程 ?

咨询区 David Boike请问在 C# 中是否有好的方式判断 path 是在本地还是在远程,我想到了用 UNC 属性来判断&#xff0c;比如下面的代码&#xff1a;new Uri(path).IsUnc但这代码也有一定的问题,它会误判下面的 path 格式。\\machinename\sharename\directory \\10.12.34.56\shar…

交换系统接媒体服务器,基于软交换的媒体服务器的设计与实现

摘要&#xff1a;随着VoIP(Voice over Internet Protocol,俗称网络电话)的迅速发展,单纯的语音业务已经无法满足用户和市场的需求,因此一种具有多媒体业务的VoIP的方案——IP媒体服务器因此产生了。它可以提供更具个性化和差异性的增值业务,而且可以为提供商带来更高的利润。国…

Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)

http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html转载于:https://www.cnblogs.com/cliffhuang/p/3708696.html

web服务器的基本应用

WEB服务器也称为WWW(WORLD WIDE WEB)即是所谓的万维网服务器&#xff0c;主要功能是提供网上信息浏览服务。 最常用的大型Web服务器是Apache和微软的Internet信息服务器&#xff08;Internet Information Server&#xff0c;所谓的IIS服务器&#xff09;、IBM WebSphere以及BE…

Android 之PackageManager框架

http://blog.csdn.net/stonecao/article/details/6591454 1.接着前面讲的ActivityManager框架&#xff0c;继续说一下系统另一个重要的框架&#xff0c;PackagerManager 同样先看一下静态类结构图&#xff1a; 大部分情况我们是在Activity中使用getPackageManager方法获取一个…

有一个会泰勒级数的八岁表妹是怎样一种体验?

全世界只有3.14 % 的人关注了爆炸吧知识上一篇文章超模君给大家介绍了欧拉公式&#xff0c;很多粉丝问我&#xff1a;八岁表妹明明还是小学生&#xff0c;是怎么知道泰勒级数的意思的?答案其实很简单&#xff0c;这当然和我们全家优秀的基因...不&#xff01;优良的家教有关&a…

限流中间件IpRateLimitMiddleware的使用

前言IpRateLimitMiddleware&#xff08;Github: AspNetCoreRateLimit&#xff09; 是ASPNETCore的一个限流的中间件&#xff0c;用于控制客户端调用API的频次&#xff0c; 如果客户端频繁访问服务器&#xff0c;可以限制它的频率&#xff0c;已降低访问服务器端的压力。或者如果…

对抗告警疲劳的8种方法

【编者按】本文作者为 Chris Riley&#xff0c;主要介绍告警疲劳的产生原因与对抗告警疲劳的8种方法。文章系国内 ITOM 管理平台 OneAPM 编译呈现。 各司其职、孤军作战非常不利于团队沟通&#xff0c;一旦发生重大事件&#xff0c;各个部门就很难掌握事件始末&#xff0c;这不…

EL表达式

一、EL简介 1.语法结构 ${expression}2.[]与.运算符 EL 提供.和[]两种运算符来存取数据。 当要存取的属性名称中包含一些特殊字符&#xff0c;如.或?等并非字母或数字的符号&#xff0c;就一定要使用 []。例如&#xff1a; ${user.My-Name}应当改为${user["My-Name&quo…

制作Geek风格的投影片

做投影片用什么&#xff1f;如果你的回答是用PowerPoint&#xff0c;有没有感觉弱爆了&#xff1f;好吧&#xff0c;也许你会说用开源的替代&#xff0c;比如openOffice/Libreoffice。当然其实本质都是一样的&#xff0c;那就是PPT&#xff01;从今天开始不要再说、再用 PPT这三…