REST API端点设计与用户差异化站点资源缓存策略咨询
问题1:是否需要将userId作为查询参数加入URI?
不需要,原因如下:
- 从RESTful设计规范来看,
/tenant/:tenantId/sites/:siteId已经完整定位了「指定租户下的指定站点」这个资源,userId属于请求上下文的权限过滤维度,不属于资源定位的必要组成部分,不需要放到URI中。 - 你已经可以从JWT Token中稳定提取userId,将其放到URI反而会带来额外风险:比如请求日志泄露用户ID、参数可被篡改伪造权限等。
- 如果后续要做网关层缓存,把userId放到URI会直接导致相同站点不同用户的缓存完全拆分,徒增不必要的缓存存储成本。
问题2:缓存策略设计与失效规则
你可以结合API网关的能力,按以下方案设计:
缓存基础规则
- 响应头统一配置
Cache-Control: private, max-age=300, must-revalidate:private标记该响应为用户私有内容,禁止公共缓存(如公共CDN)存储,仅允许用户端本地缓存和你自己可控的API网关缓存存储;max-age可根据业务可接受的不一致时长调整(示例为5分钟);must-revalidate要求缓存过期后必须回源校验,不能直接使用过期内容。 - API网关的缓存键设置为
URI + 从JWT提取的userId:不要直接把完整JWT放到缓存键(JWT会定期刷新,同一个用户的不同Token会生成重复缓存),仅用userId作为用户维度的区分即可,既避免不同用户的权限数据串扰,也不会浪费缓存空间。
缓存失效规则
分两种更新场景处理,不需要所有情况都清全部用户缓存:
- 站点资源本身更新:比如站点树结构、站点公共内容修改,此时所有用户的返回结果都会变化,直接通过API网关清除该
/tenant/:tenantId/sites/:siteIdURI前缀下的所有缓存即可,不需要单独定位单个用户的缓存键。 - 用户/用户组权限更新:比如调整用户所属组、修改用户组的站点访问权限,此时仅受影响的用户的返回结果会变化,只需要清除这些用户对应站点URI的缓存即可,其他用户的缓存不受影响,大幅缩小缓存失效范围。
内容的提问来源于stack exchange,提问作者systemdebt
相关产品推荐
相关产品推荐

