IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

在CGI中通过Etag和Cache-Control来控制流量,访问量及生效时间

Vimer 2010-07-22 20:00:28 累计浏览 4,334 次
本机暂存

最近遇到一个需求,即一个配置文件,由于这个文件的访问量非常大(8000次/秒),并且配置文件本身也比较大,所以需要
1.发布之后在5分钟之内生效
2.要能够cache,并尽量减少请求量和流量

对于以上的需求进行分析,首先否定掉放到CDN上,因为虽然第二点满足,但是第一点没法满足。

那么只能通过cgi读取配置文件返回内容来实现,具体方法如下:
1.发布之后5分钟生效
使用Etag,在这里即为配置文件的md5值,当来的请求的Etag值和服务器上的版本不一致时,才返回数据,并设置新的Etag;否则,返回304
2.能够cache
使用Cache-Control,来设定cache的时间

从而,使用Etag减少了流量,使用cache减少了请求量,并且同时兼顾了数据的更新时间可控。

示例代码如下:
返回304:

void CAppBaseConf::PrintHttp304()
{
std::string v = "HTTP/1.1 304 Not Modified\r\nServer: qzhttp\r\n";
printf("%s",v.c_str());
CCGIEx:: OutputHttpHeader();
 return;
}

返回正常数据并设置Etag:

int CAppBaseConf::SetEtag(std::string &etag)
{
 if(etag.size() <= 0)
  return  0;
printf("Etag: %s\r\n",etag.c_str());
 return 0;
}

服务器抓包截图如下:

截图

304返回:

HTTP/1.1 304 Not Modified
Server: qzhttp
Content-Type: text/html; charset=utf-8
Connection: keep-alive

正常返回:

HTTP/1.1 200 OK
Server: QZHTTP-2.12
Date: Thu, 22 Jul 2010 10:24:15 GMT
UUID: 2872113653
Content-Length: 35
Etag: 2
Cache-Control: max-age=1800
Content-Type: text/html; charset=utf-8
Connection: keep-alive
_Callback(
{"ret":0,
"flag":"2"});

可以看出,确实是生效了。

附:
 cgi代码下载
 httpwatch完整抓包

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用.htaccess 开启gzip 缓存文件 网页 提高速度 (累计阅读 7,602)
  2. 浏览器缓存机制 (累计阅读 7,314)
  3. web应用应该考虑的一些问题 (累计阅读 7,231)
  4. AWStats是一个基于Perl的WEB日志分析工具。 (累计阅读 7,175)
  5. 谈冷热数据 (累计阅读 7,005)
  6. 基于Squid的视频业务日志分析 (累计阅读 7,004)
  7. Craigslist 的数据库架构 (累计阅读 6,701)
  8. PHP处理Etag、lastModified和Expires (累计阅读 6,094)
  9. php-erlang (累计阅读 5,267)
  10. [squid] 过期时间在 60 秒内 squid 不 Cache 的问题 (累计阅读 4,942)