标准答案

  1. Key 应有稳定命名空间,例如 product:v2:{tenantId}:{productId},把资源类型、版本、租户和业务主键按固定顺序表达。
  2. 多租户场景必须把已验证的租户上下文纳入 Key;不能直接相信客户端传来的 tenantId,也不能让不同租户复用同一个对象缓存。
  3. 版本前缀可用于字段结构或序列化协议升级,新旧读写在迁移期并存,完成后再清理旧版本,而不是让新代码尝试反序列化所有历史字节。
  4. 序列化格式要考虑体积、兼容性、调试性和安全性。跨服务对象应避免依赖语言私有序列化和不可信反序列化,字段演进要有默认值和未知字段策略。

题目解析

Key 设计本质是数据边界设计。省略租户、权限范围、语言或版本时,缓存很可能在后续扩展中出现串数据、读错语言或升级失败。

命名不应把敏感值直接拼入 Key,例如完整手机号、令牌或身份证号;既会泄露到监控和导出中,也会增加合规风险。

代码示例

版本和租户都应来自可信服务端上下文,示例只展示命名层次。

Text
product:v2:{tenant-42}:98765
profile:v3:{user-1001}
rate-limit:v1:{tenant-42}:{api:orders}

常见误区

  • 只用业务 ID 作为 Key,后续接入多租户后发生跨租户命中。
  • 在 Key 中拼接完整敏感信息或未规范化的用户输入。

作者信息