【转】Cache 文件是否存在的查询

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

        当我们使用 Squid 的时候,是不是常常会有个问题,怎么查文件是否存在?大家是怎么查的,我想大多都是使用 wget 来查,比如wget -S。 如果返回的响应头部X-Cache显示 HIT, 那么文件就是从 squid的缓存中读取的,而不是从源网站读取,但但这样做效率比较低。如果有大量的文件,比如 100万份,那怎么办, 难道统统下载一次?有人就讲了, 我不是可以发 Head 请求查吗?比如使用 Curl  -I 来查, 这样就没有下载文件的过程,多快啊。 事实是这么简单吗?

1.  当文件不存在时首次查询 Squid

我们来使用 curl 加 -I 的参数来查询

curl -I http://www.php-oa.com/data/emagazine/mode/mode_10.exe
......
X-Cache: MISS from BM_SC.php-oa.com

 嗯,很好,不存在,正常。文件不存在时就显示 MISS ,这是对的。 

2. 上次查询后在次查询 Squid
我们来使用 curl -I 来再查一次

curl -I http://www.php-oa.com/data/emagazine/mode/mode_10.exe
.........
X-Cache: HIT from BM_SC.php-oa.com

嗯,文件存在了,由 MISS 变成了 HIT。因为查询也是一次访问,所以会给这个文件下载回来,所以第二次变成 HIT。

 

3. 使用 Wget 确认查询
好了,我们现在在使用 wget -S 来在测试一下

wget -S http: //www .php-oa.com /data/emagazine/mode/mode_10 .exe
........
X-Cache: MISS from BM_SC.php-oa.com

怎么回事,明明查了有,怎么是 MISS?其实这是对的,因为 curl  -I  只发了一个 head 请求,Squid 会给这个 head 做 h ,但对对象本身的内容不会下载.所以第一次查的状态是对的.以后都会是错的响应.

 

解决方法

好了,一个高级又快速的解决方法 ,我们还记的 ICP 吗…是父子模式时用来处理查询 Cache 是否存在的方法 …所以我们只要实现一个 ICP 协议的查询就行了.这样就能大量查询,状态还会很准…

还好,有人写好了现成的 ICP 协议的客户端.下载地址: http://icp.ircache.net/tools/udp-banger.pl
使用很简单,我们先准备一个要查询的列表,比如,example.txt

cat example.txt |perl udp-banger.pl xxx.xxx.xxx.x 3130


这样在标准输出,就会输出相关的内容

UDP_MISS http: //www .php-a.com/%C5%F9%F6%A8MIT%28%B5%DA01%BC%AF%29.mp4
UDP_HIT http: //www .php-oa.com/%C5%F9%F6%A8MIT%28%B5%DA01%BC%AF%29.mp4
UDP_MISS http: //www .php-a.com/%C5%F9%F6%A8MIT%28%B5%DA01%BC%AF%29.mp4


当然,这个还得对Squid进行适当的配置

icp_port 3130         # 端口
icp_hit_stale off     # 过期了,但存在是否还回答为 HIT
icp_access allow all  # 那些地址可以查询
#icp_access deny all



转载于:https://my.oschina.net/aiguozhe/blog/41599

你可能感兴趣的:(php,c#,python)