缓存键按用户角色隔离的核心是将角色标识作为缓存键的固定组成部分,推荐格式如cache:{role}:{model}:{prompt_hash},需区分角色层级、按业务敏感度分级处理、结合ttl策略,并采用小写下划线命名与稳定role_code。

缓存键按用户角色隔离,核心是把角色标识作为缓存键的固定组成部分,确保不同角色即使请求相同内容,也命中各自独立的缓存项。这既保障数据一致性(如管理员需实时数据、普通用户可接受缓存),又避免权限越界风险。
在键中显式嵌入角色标识
将用户角色(如 role:admin、role:user)作为缓存键前缀或结构化字段,而非仅依赖用户ID或会话ID:
- 推荐格式:cache:{role}:{model}:{prompt_hash} 或 {role}_dashboard_data_{user_id}
- 避免仅用 user:{id}:data —— 同一用户切换角色时无法区分,且不同角色间可能意外共享缓存
- 若使用 RBAC 多级角色(如 role_level=0 表示超级管理员),可直接取 role_level 值参与构造,增强可排序性和策略扩展性
结合角色动态控制键生成逻辑
不是所有请求都需角色隔离,应按业务敏感度分级处理:
- 对管理后台接口(如系统监控页),强制加入 role 字段;对公开内容页(如帮助文档),可省略以提升复用率
- 在键生成函数中做条件判断:if is_admin() then include_role_in_key() else omit_role()
- GraphQL 场景下,可通过自定义指令(如 @cacheControl(scope: "role"))由服务层自动注入角色上下文
配合 TTL 实现角色感知的时效策略
角色不仅影响“是否隔离”,还决定“缓存多久”:
- 管理员缓存键可附加短 TTL(如 60 秒),并设置 key_suffix: "_admin_short" 便于定向清理
- 普通用户缓存键用长 TTL(如 3600 秒),后缀为 "_user_long"
- 清除时可按前缀批量操作:Redis 中执行 KEYS cache:admin:* 或 Laravel 中调用 Cache::flush('cache:admin')
注意命名规范与运维友好性
角色相关键名需兼顾可读性与机器处理效率:
- 统一使用小写、下划线分隔,如 cache_role_admin_user_list_v2,避免大小写混用或特殊符号
- 角色编码(role_code)比角色名称(role_name)更适合作为键成分——稳定、唯一、无空格和中文
- 不建议用角色中文名(如 管理员)或动态翻译值,易导致键不一致和哈希冲突











