Linux下DNS缓存实现通常有两种方式:
一种是用DNS缓存程序NSCD(name service cache daemon)负责管理DNS缓存。
一种实现DNS缓存则是用Bind来架设Caching Name Server来实现。
如果是清除NSCD上的Cache,可重新启动NSCD服务来达成清除DNS Cache的效果。用这个命令:
# service nscd restart
或是
#/etc/initd/nscd restart
如果是清除BIND服务器上的CACHE,用这个命令:
# rndc flush
如果你的DNS服务器是用dnsmasq实现的,用下面这个命令:
$ sudo /etc/initd/dnsmasq restart
注:DNSmasq是一个轻巧的,容易使用的DNS服务工具,它可以应用在内部网和Internet连接的时候的IP地址NAT转换,也可以用做小型网络的DNS服务。
一、什么是缓存
1、Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问
2、凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache
常见的缓存技术有哪些?
一、 *** 作系统缓存
1、文件系统提供的Disk Cache: *** 作系统会把经常访问到的文件内容放入到内存当中,由文件系统来管理
2、当应用程序通过文件系统访问磁盘文件的时候, *** 作系统从Disk Cache当中读取文件内容,加速了文件读取速度
3、Disk Cache由 *** 作系统来自动管理,一般不用人工干预,但应当保证物理内存充足,以便于 *** 作系统可以使用尽量多的内存充当Disk Cache,加速文件读取速度
4、特殊的应用程序对文件系统Disk Cache有很高的要求,会绕开文件系统Disk Cache,直接访问磁盘分区,自己实现Disk
5、Cache策略
Oracle的raw device(裸设备) – 直接抛弃文件系统
MySQL的InnoDB: innodb_flush_method = O_DIRECT
二、数据库缓存
缓存策略:a、Query Cache; b、Data Buffer
三、应用程序缓存
包括对象缓存、查询缓存、页面缓存
四、web服务器端缓存
基于代理服务器模式的Web服务器端缓存,如squid/nginx
Web服务器缓存技术被用来实现CDN(内容分发网络 content delivery network)
被国内主流门户网站大量采用
不需要编程,但仅限于新闻发布类网站,页面实时性要求不高
五、基于ajax的浏览器缓存
使用AJAX调用的时候,将数据库在浏览器端缓存
只要不离开当前页面,不刷新当前页面,就可以直接读取缓存数据
只适用于使用AJAX技术的页面
1、ipconfig
/flushdns的作用
ipconfig
/flushdns
这是清除DNS缓存用的。
当访问一个网站时系统将从DNS缓存中读取该域名所对应的IP地址,当查找不到时就会到系统中查找hosts文件,如果还没有那么才会向DNS服务器请求一个DNS查询,DNS服务器将返回该域名所对应的IP,在你的系统收到解析地址以后将使用该IP地址进行访问,同时将解析缓存到本地的DNS缓存中。
如果DNS地址无法解析,或者是DNS缓存中的地址错误,一般才会使用ipconfig/flushdns来清除所有的DNS缓存。
2、通过调用API函数来实现该命令行命令的执行
通过该命令的组成形式即可得知,/flushdns应该是作为参数传给ipconfigexe可执行程序的。如果要实现该命令的执行,可以使用system()函数,将ipconfig
/flushdns作为参数来传入,该函数的执行受环境变量的影响,实际使用时可能存在问题。也可以考虑使用ShellExecute启动ipconfigexe,并将/flushdns作为参数传递进来,但这样做也有问题,比如可能会遭到杀毒软件的拦截,对于Win7、Win8系统,可能会因为UAV权限问题被警告。
所以要看看有没有对应的API函数可供使用,直接调用API则最有效最安全。于是到MSDN中尝试着搜索,但是找不到相关的函数。既然是传递/flushdns参数执行ipconfigexe,那尝试着使用VC自带的Depends工具看看能否找到对应的接口。结果发现了其依赖的DNSAPIDLL中有叫做DnsFlushResolverCache函数,如下图所示:
这个函数应该是非公开的API函数,那可以使用LoadLibrary显示加载,并用GetProcess得到函数指针,直接调用之即可。通过搜索,得到该函数的原型声明:
[cpp]
view
plain
copy
BOOL
WINAPI
DnsFlushResolverCache(VOID);
从DNSAPIDLL动态库中显式加载调用DnsFlushResolverCache的代码如下所示:
[cpp]
view
plain
copy
BOOL
__stdcall
DnsFlushResolverCache()
{
BOOL
bRet
=
FALSE;
typedef
BOOL
(WINAPI
PfuncDnsFlushResolverCache)(VOID);
HMODULE
hDnsModule
=
LoadLibrary(
_T("dnsapidll")
);
if
(
hDnsModule
!=
NULL
)
{
PfuncDnsFlushResolverCache
pFlushFun
=
GetProcAddress(
hDnsModule,
"DnsFlushResolverCache"
);
if
(
pFlushFun
!=
NULL
)
{
pFlushFun();
bRet
=
TRUE;
}
FreeLibrary(
hDnsModule
);
}
return
bRet;
}
3、通过调用API函数来实现该命令行命令的执行
今天因为系统出现故障,终端一直无法登录到平台。为了解决该问题,将平台的网络由联通的网络切换到电信的网络,结果就出现了部分终端能够登录,部分终端不能登录的情况。考虑到可能是系统DNS缓存引起的,终端侧将域名解析出来的地址一直是之前的联通地址(即缓存中的地址),所以一直无法登录。于是使用ipconfig
/flushdns命令清理了一下系统的DNS缓存即可正常登录了。为了规避这样由网络切换和DNS缓存引起的问题,可以考虑在多次登录失败后自动去清理系统的DNS缓存。
以上就是关于如何清空linux中dns缓存全部的内容,包括:如何清空linux中dns缓存、哪位了解java数据缓存技术有哪些、怎么使用ipconfig清空dns缓存等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)