IT技术博客大学习 共学习 共进步

Cache 文件是否存在的查询

扶凯 2010-11-17 19:16:59 浏览 3,464 次

  当我们使用 Squid 是不是常常会有个问题,就是怎么查文件是否存在。大家是怎么查的。。。我想大多都是使用 wget 来查。wget -S 如果显示 HIT 就是文件从 Cache 中取的,不是从源网站取的。但这个过程非常慢,因为如果是大量的文件,比如 100W 的文件要查怎么办。。。都下载一次?
有人就讲了,我不是可以发 Head 的头来查吗?比如使用 Curl 来查。这样没有下载文件的过程,这样多快啊。。。,只要发送一个 head 的头就能确认文件是否存在
但这时有一个问题,那我们在看看有什么样的问题。

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

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

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

2. 上次查询后在次查询 Squid
嗯,很好,不存在。。。。我们在查一次,使用上面的命令,就发现,嗯,文件存在了,由 MISS 变成了 HIT 。。。。

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

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 来做 cache ,但对对象不会下载。所以第一次查的状态是对的。以后都会是错的响应。

解决方法

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

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

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

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

UDP_MISS http://www.php-oa.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-oa.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

建议继续学习

  1. 使用Squid缓存视频 (阅读 10,244)
  2. 海量小文件存储 (阅读 9,704)
  3. 其实,文件也可以truncate (阅读 8,444)
  4. Buffer和cache的区别是什么? (阅读 7,843)
  5. 谈冷热数据 (阅读 6,884)
  6. 系统架构的一些思考 (阅读 6,683)
  7. Linux操作系统中内存buffer和cache的区别 (阅读 6,342)
  8. Twitter架构图(cache篇) (阅读 5,983)
  9. 学习:一个并发的Cache (阅读 5,964)
  10. 关于Linux的文件系统cache (阅读 5,824)