Skip to content

perf: 优化权限检查和缓存策略#16

Open
PrintNow wants to merge 1 commit into2.0from
perf/permission-and-cache-optimization
Open

perf: 优化权限检查和缓存策略#16
PrintNow wants to merge 1 commit into2.0from
perf/permission-and-cache-optimization

Conversation

@PrintNow
Copy link
Copy Markdown
Owner

@PrintNow PrintNow commented May 5, 2026

Summary

  • 权限检查优化:消除 N+1 查询,将 40+ 次数据库查询优化为 1-2 次
  • 缓存优化:菜单缓存默认开启,getPermissionId 结果缓存
  • 导出内存优化:避免 toArray() 内存拷贝
  • Octane 兼容:所有优化使用 once() 提供请求级缓存,兼容常驻内存环境

性能提升

优化点 优化前 优化后 提升
权限检查(20个菜单项) 40+ 次查询 1-2 次查询 ~95%
getPermissionId 每次 SQL 查询 缓存 1 小时 ~99%
导出内存使用 2x 数据量 1x 数据量 ~50%

变更文件

文件 变更
src/Models/Role.php can() 使用 once() 缓存,getPermissionId() 使用 Cache
src/Traits/HasPermissions.php can/isRole/inRoles 使用映射数组快速查找
src/Grid/Exporters/AbstractExporter.php normalize() 直接遍历 Collection
config/admin.php 菜单缓存默认开启

Octane 兼容性

  • 优化点 1:使用 once() 而非实例属性缓存
  • 优化点 2:使用 once() 而非实例属性缓存
  • 优化点 3:无状态,仅涉及单次请求内操作
  • 优化点 4:使用 Laravel Cache,兼容
  • 优化点 5:使用 Laravel Cache,兼容

Test plan

  • 验证菜单渲染、权限检查功能正常
  • 验证角色/权限变更后缓存自动清除
  • 验证导出大数据量时内存使用情况
  • 运行现有测试确保无回归
  • 使用 Laravel Octane 环境测试,确保无数据泄露

权限检查优化:
- Role::can() 使用 once() 缓存 permissions 集合,避免重复查询
- HasPermissions::can() 预构建 slug/id 映射数组,使用 isset() 快速查找
- HasPermissions::isRole() 和 inRoles() 同样优化为映射数组查找

缓存优化:
- 菜单缓存默认开启(config admin.menu.cache.enable = true)
- Role::getPermissionId() 使用 Laravel Cache 缓存查询结果
- 权限/角色变更时自动清除缓存

导出内存优化:
- AbstractExporter::normalize() 直接遍历 Collection,避免 toArray() 内存拷贝

所有优化兼容 Laravel Octane 等常驻内存环境,使用 once() 提供请求级缓存。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant