description |
---|
缓存处理 |
HTTP缓存使用了LRU缓存,能提供高效的缓存读取能力及有效控制缓存过大。为了减少缓存中锁的影响,使用了128个LRU组成缓存桶,每次根据hash选择对应的LRU,提升性能。需要注意,缓存只针对GET
与HEAD
请求,其它的请求都是不可缓存请求。
- 根据请求的URL生成key(Method + Host + RequestURI)
- 使用该key通过MemHash生成hash值取余获取对应的缓存桶
- 从缓存桶中获取缓存数据
HTTP缓存的有效期仅支持从Cache-Control
响应头中获取,获取有效期的流程如下:
- 如果响应头有
Set-Cookie
,则返回缓存有效期为0 - 如果响应头无
Cache-Control
,则返回缓存有效期为0 - 如果响应头中
Cache-Control
包含no-cache
,no-store
或者private
,则返回有效期为0 - 如果响应头中
Cache-Control
包含s-maxage
,则优先根据s-maxage
获取缓存有效期 - 如果响应头中
Cache-Control
包含max-age
,则根据max-age
获取缓存有效期 - 如果响应头中有
Age
字段,则最终的缓存有效期需减去Age
passed
如果请求非HEAD与GET请求,其缓存状态则为passed(并不缓存数据),直接跳过缓存转发至后端服务fetching
当请求对应的key无法查找到缓存时,其缓存状态则为fetching,表示无缓存转发至后端服务。当获取该请求响应时,如果可缓存,则将相关数据缓存。如果不可缓存时,则缓存hit for pass(只缓存状态不需要缓存数据)hit
当请求对应的key可以获取到缓存数据,且该数据是可缓存,则直接返回hitForPass
当请求对应的key获取到缓存数据,且该数据是hit for pass时,则直接转发至后端服务
Pike的设计保证了当缓存不存在时,相同的请求只会有一个请求至upstream,整体设计主要是为了应对高并发时系统性能下降,并不建议使用它来提升一个本来响应慢的请求。在使用时,也建议使用短缓存(Cache-Control中设置max-age或s-maxage),避免需要手工删除数据,非静态文件建议缓存时长不超过5分钟,静态文件(url中有相应的版本号)不超过1小时。