Skip to content

缓存与性能 ​

平台的瓦片与元数据都带标准的 HTTP 缓存头,浏览器、CDN 与反向代理可以直接利用。本页说明各类地址的缓存时长、数据改动后多久能看到新结果,以及何时预切片。

瓦片从哪里来 ​

浏览器 / CDN  →  平台的运行时缓存  →  预切缓存  →  现场生成
  • 浏览器 / CDN:按下表的 Cache-Control 与 ETag 缓存。
  • 运行时缓存:平台把现场生成的瓦片保存在内存与磁盘中,同一瓦片同时被多次请求时只生成一次。
  • 预切缓存:提前切好的瓦片,在预切的级别范围内直接读取,见预切片。
  • 以上都没有命中时现场生成,单张瓦片可能需要数百毫秒到数秒。

各类地址的 Cache-Control ​

公开服务的实际值:

地址Cache-Control说明
VectorTileServer 矢量瓦片 tile/{z}/{y}/{x}.pbfpublic, max-age=300读自预切缓存时 public, max-age=3600
MapServer 切片 tile/{z}/{y}/{x}、WMTS 切片public, max-age=300读自预切缓存时 3600
空瓦片(HTTP 204)与同地址的非空瓦片相同避免对没有数据的区域反复请求
tiles.json、resources/styles、WMTS 能力文档no-cache每次向平台确认,没有变化时返回 304
服务内的雪碧图与字形public, max-age=86400
平台字体 /fonts/…public, max-age=86400字形缺失时用更短的时长
平台雪碧图 /sprites/…public, max-age=300图标集可以在控制台编辑,缓存时间较短
MapServer、VectorTileServer 的 export 图片,WMS GetMap 图片public, max-age=60参数组合多,短时缓存
地图方案样式 style.json、服务目录no-cache
不完整的瓦片与出图no-store有图层因超时、过密等原因被跳过,不缓存,下次重新生成
一切错误响应no-store包括 4xx、5xx
  • ETag 与 304:瓦片与元数据(tiles.json、样式、WMTS 能力文档、雪碧图、字形)带强 ETag。客户端带 If-None-Match 再次请求、内容未变时返回 304,没有正文。export 与 GetMap 的图片不带 ETag、不支持 304。
  • 非公开服务(「API Key」与「私有」级别):成功响应改为 private(保留 max-age),并带 Vary: X-GeoBridge-Token。只进浏览器的私有缓存,CDN 与共享代理不应缓存。
  • 共用电脑:浏览器在 max-age 内可能直接复用上一个账号读过的私有瓦片。同一浏览器退出后换账号登录时,请清除浏览器缓存。
  • gzip:矢量瓦片以 gzip 压缩传输(请求带 Accept-Encoding: gzip 时),响应带 Vary: Accept-Encoding。
  • 有图层没有绘制的瓦片与出图带响应头 X-GeoBridge-Omitted-Layers(逗号分隔的图层编号)。只因超出比例尺范围而省略的图层不算不完整,照常缓存;分级样式的大图层在某个比例尺首次出图、要素数尚未统计完成而暂时省略时,以及按样式放宽后读取超出上限时,算不完整,不缓存。

服务从公开改为非公开 ​

改级别之前以 public 发出的瓦片若已被 CDN 或共享代理缓存,会保留到各自的 max-age 过期(瓦片 300 秒,预切瓦片 3600 秒,出图 60 秒),期间任何人都能从 CDN 取到。改级别后请在 CDN 上清除该服务的地址前缀。 见访问级别。

瓦片相关的错误 ​

情形响应
服务没有切片方案(MapServer 切片与 WMTS 只在服务启用了预切片时;未预切片的服务按需出图,不需要切片方案)404 TILING_NOT_CONFIGURED「该服务未配置切片」
级别、行列号为负数400
预切缓存读取失败503,不返回空瓦片
代理的远程切片源出错503
其他生成错误500「切片生成失败」

数据改动后多久能看到 ​

经平台修改的数据 ​

以下操作会让服务的缓存自动失效,下次访问重新生成:

  • 通过 FeatureServer 的编辑接口修改要素(被编辑的图层所在的所有服务都会失效);
  • 修改服务引用的图层、数据源或样式,或重新发布服务;
  • 启动、重新启动服务;
  • 修改服务的署名。

此时用户看到新结果的最长延迟等于浏览器缓存时长:瓦片约 5 分钟(max-age=300)。经过 CDN 时还要加上 CDN 的缓存时间。

在平台之外直接修改数据库 ​

平台感知不到这类修改。两种办法:

  • 等待:平台的运行时缓存最长保留 24 小时。
  • 在控制台点「清除瓦片缓存」(见下文),之后只受浏览器缓存约束(约 5 分钟)。

字体与图标 ​

字体库、图标库的变更不会让服务的瓦片缓存失效。矢量瓦片本身不含字体与图标,受影响的主要是服务端出图(栅格切片、export);需要旧区域立刻使用新字体或图标时,请对相关服务点「清除瓦片缓存」。

清除瓦片缓存 ​

  • 位置:控制台服务详情页右上角「更多操作」菜单中的「清除瓦片缓存」,仅在服务能力包含 MapServer 或 VectorTileServer 时显示。
  • 确认:点击后弹出确认框。清除后所有瓦片在下次访问时重新生成,期间访问会变慢;预切缓存不受影响,按需生成的图片切片会一并清除。确认后提示「瓦片缓存已清除」。
  • 权限:与启动、停止服务相同,需要该工作空间的服务管理权限。
  • 已被浏览器或 CDN 缓存的瓦片不受影响,在 max-age 内仍可能看到旧的。

预切片 ​

什么时候该预切 ​

  • 数据稳定、很少变化,访问量大的服务;
  • 级别不超过 14(级别越高,瓦片数量增长越快);
  • 希望第一次访问也很快:运行时缓存只能加速第二次及以后的访问,第一次仍要现场生成。

数据经常变化的服务不适合预切:预切瓦片只在重新切片后才更新,读取时的缓存时长也更长(3600 秒)。

怎样发起 ​

在控制台服务详情页右上角点「生成切片缓存」(服务需要有切片方案),进入新建处理任务页,按「规划切片范围 → 生成切片 → 打包切片」的流程创建任务。任务完成后,预切级别范围内的请求直接读预切缓存;范围之外的请求照常走运行时缓存与现场生成。

性能建议 ​

  • 浏览器端的地图优先用矢量瓦片(VectorTileServer)或切片(MapServer tile、WMTS),它们可以被浏览器与 CDN 缓存;export 与 WMS GetMap 只适合偶尔出图。
  • 「API Key」级别的服务在跨域网页里用请求头传 Key 时,浏览器会对每个不同的地址先发一次预检请求。瓦片多、对速度敏感的页面可以改用查询参数 token,见 API Key 与来源白名单。
  • 公开服务可以放在 CDN 之后,CDN 按平台返回的 Cache-Control 缓存即可;非公开服务的响应为 private,CDN 不应缓存。