各级缓存的使用场景以及限制

本文深入讲解了HTTP缓存的工作原理,包括Pragma、Expires、Cache-Control等关键头字段的作用及使用方式,探讨了如何通过合理设置这些头部信息来提高网站性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP缓存 可以防爬虫

HTTP缓存可以极大的减少带宽的使用

Pragma
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。
在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。

Expires
文件在本地缓存的过期时间,如果浏览器发现缓存中的文件没有过期,则不发送请求(有例外,后面介绍)

Cache-Control
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。

各个消息中的指令含义如下:   

Public指示响应可被任何缓存区缓存。

Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请 求无效。   

no-cache指示请求或响应消息不能缓存。   

no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。   max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。   

min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。   

max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

HTTP缓存原理

当资源第一次被访问的时候,HTTP头部如下

(Request-Line) GET /a.html HTTP/1.1
Host    127.0.0.1
User-Agent  Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.15)Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept             text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language     zh-cn,zh;q=0.5
Accept-Encoding     gzip,deflate
Accept-Charset      gb2312,utf-8;q=0.7,;q=0.7
Keep-Alive          300
Connection          keep-alive

HTTP返回头部如下
(Status-Line)      HTTP/1.1 200 OK
Date                Thu, 26 Nov 200913:50:54 GMT
Server              Apache/2.2.11 (Unix)PHP/5.2.9
Last-Modified       Thu, 26 Nov 2009 13:50:19 GMT
Etag                “8fb8b-14-4794674acdcc0″
Accept-Ranges       bytes
Content-Length      20
Keep-Alive          timeout=5, max=100
Connection          Keep-Alive
Content-Type        text/html

当资源第一次被访问的时候,http返回200的状态码,并在头部携带上当前资源的一些描述信息,如

Last-Modified     // 指示最后修改的时间
Etag                     // 指示资源的状态唯一标识
Expires               // 指示资源在浏览器缓存中的过期时间


接着浏览器会将文件缓存到Cache目录下,并同时保存文件的上述信息

当第二次请求该文件时,浏览器会先检查Cache目录下是否含有该文件,如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求


如果文件此时已经过期,则浏览器会发送一次HTTP请求到WebServer,并在头部携带上当前文件的如下信息

If-Modified-Since  Thu, 26 Nov 2009 13:50:19 GMT
If-None-Match       ”8fb8b-14-4794674acdcc0″

即 把上一次修改的时间,以及上一次请求返回的Etag值一起发送给服务器。服务器在接收到这个请求的时候,先解析Header里头的信息,然后校验该头部信 息。 如果该文件从上次时间到现在都没有过修改或者Etag信息没有变化,则服务端将直接返回一个304的状态,而不再返回文件资源,状态头部如下
(Status-Line)      HTTP/1.1 304 Not Modified
Date                Thu, 26 Nov 200914:09:07 GMT
Server              Apache/2.2.11 (Unix)PHP/5.2.9
Connection          Keep-Alive
Keep-Alive          timeout=5, max=100
Etag                “8fb8b-14-4794674acdcc0″

这样,就能够很大程度上减少网络带宽以及提升用户的浏览器体验。 当然,如果服务器经过匹配发现文件修改过了,就会将文件资源返回,并带上新文件状态信息。


首先开启mybatis的二级缓存
  在核心配置文件SqlMapConfig.xml中加入

<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>

在classpath下加入ehcache.xml文件

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="F:\develop\ehcache" />
<defaultCache
maxElementsInMemory="1000"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache> 
在对应的Mapper.xml中开启二缓存,UserMapper.xml下的sql执行完成会存储到它的缓存区域(HashMap)

<cache type="org.mybatis.caches.ehcache.EhcacheCache" >
<property name="timeToIdleSeconds" value="3600"/>
<property name="timeToLiveSeconds" value="3600"/>
<!-- 同ehcache参数maxElementsInMemory -->
<property name="maxEntriesLocalHeap" value="1000"/>
<!-- 同ehcache参数maxElementsOnDisk -->
<property name="maxEntriesLocalDisk" value="10000000"/>
<property name="memoryStoreEvictionPolicy" value="LRU"/>
</cache>

log4j打印如下日志,说明缓存开启成功:

DEBUG [main] - Cache Hit Ratio [cn.itcast.jdbc.mapper.UserMapper]: 0.0




CDN?

java堆缓存

redis等NOSQL

http://blog.youkuaiyun.com/jeff_0825/article/details/46602931

http://jinnianshilongnian.iteye.com/blog/2319573

http://tech.meituan.com/cache_about.html

http://blog.youkuaiyun.com/u013970991/article/details/52870797


### 多级缓存设计与实现 多级缓存作为一种常见的性能优化手段,在实际应用中通常涉及本地缓存和分布式缓存的组合使用[^2]。其核心目标在于通过分层的方式降低对底层存储系统的依赖,从而提升响应速度并增强系统吞吐量。 #### 设计原则 在多级缓存的设计过程中,需综合考虑以下几个方面: 1. **缓存层次划分**:根据数据访问频率、延迟敏感程度等因素合理分配各级缓存的角色。例如,HTTP 缓存和 CDN 缓存主要用于静态资源加速,而 Redis 则适合作为动态数据的分布式缓存[^5]。 2. **一致性保障**:由于存在多个级别的缓存实例,如何保持它们之间的同步成为一大挑战。可以通过消息队列(如 RocketMQ 或 Kafka)来通知其他节点更新状态,进而达到最终一致性效果[^1]。 3. **淘汰策略配置**:针对同类型的数据设定合理的过期时间或者采用 LRU/LFU 等机制自动清理常用项,以此维持内存空间的有效利用率[^3]。 #### 技术选型建议 以 Java 开发为例,可以选用 Caffeine 库构建高效的本地缓存方案,同时搭配 Redis 完成跨机器间共享的大规模数据管理任务[^4]。下面给出一段简单的代码演示: ```java import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; public class MultiLevelCacheExample { private final Cache<String, String> localCache = Caffeine.newBuilder() .maximumSize(10_000) .expireAfterWrite(10, TimeUnit.MINUTES) .build(); public void put(String key, String value){ // 尝试先写入本地缓存 this.localCache.put(key,value); // 后续逻辑可扩展至远程持久化层... } } ``` 上述片段展示了基于 Caffeine 的基础封装方法,开发者能够轻松定义最大条目数以及写入超时参数等内容。 --- ### 多级缓存应用场景分析 以下是几种典型的适用场景描述: 1. **高频读取低频修改的操作** 对于那些频繁被查询却很少发生变化的内容非常适合运用多级缓存技术加以保护。比如电商网站中的商品分类列表或是新闻门户首页推荐文章集合等均属于此类范畴。 2. **热点数据分析处理** 当某些特定时间段内的请求集中指向少数几个对象时,则可通过预先加载这些可能成为焦点的目标进入更靠近客户端一侧的小范围高速缓冲池里快速返回结果给用户端感知到任何延迟现象发生. 3. **地理分布广泛的服务体系结构下** 如果应用程序部署在全球各地同的数据中心位置上运行的话那么借助CDNs之类的工具就可以很好地缓解远距离传输带来的额外耗损问题同时也减少了源站服务器的压力负担. --- ### 多级缓存架构概述 一个完整的多级缓存架构往往由以下几部分组成: - **前端代理层**: 如 NGINX 配合反向代理功能提供初步过滤筛选作用. - **边缘网络节点(CDN)**: 存储最常使用的公共资源文件副本以便更快送达终端消费者手中. - **中间件组件(MQ/ESB etc.)**: 协助完成异步事件传递职责用于维护整体健康状况良好运转无误. - **近程内存区域(Local In-Memory Store)**: 提供极致的速度体验但受限于硬件规格大小限制条件较多. - **后台数据库仓储设施(RDBMS,NoSQL Solutions)**: 承担长期保存重要记录使命确保会因为意外丢失造成可挽回损失. 综上所述可以看出良好的规划至关重要才能充分发挥各自优势特性最大化收益回报率水平. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值