mineadmin/MineAdmin

[QUESTION] 这边有一个严重的使用规范,缓存删除的时候用 scan,并且在同步接口上面

Closed this issue · 2 comments

Before you submit this issue, you has been search all existed issues and search the documentation

  • [✅] I've been search all existed issues
  • [✅] I've been read all documentation

Describe your question

前提:

  • 使用版本 v2
  • 最初遇到的问题是,线上环境添加菜单、角色的时候都接口超时,预计要3~4分钟,而线下环境没这个情况
    • 线上环境:redis 是一个大实例共用的服务,有很多微服务都会共用一个redis 期间会用 前缀、db进行隔离
    • 线下环境:同线上一样,一个redis实例,docker 部署的

详情

  • 问题点是:配置项目的redis的时候使用了默认的 db:0,在删除缓存的时候 scan redis,key的数量有四百多万 ,导致接口直接无法返回
    • 就算是给项目单独的 redis ,用了 scan 这种方法,还得去刻意控制 key 的数量,这样就本末倒置了
  • 临时处理方案:配置一个新的 redis.db
  • 优化建议:
    • 不要简单粗暴使用 scan 方法,就算是独立 redis,都禁止在同步接口上面使用
    • 像 loginInfo 这种比较分散的缓存,可以加一个管理 key 进行控制,比如新增一个 loginInfo:uerId_1 的时候,往 hash loginUserIds 里面新增一个来进行过渡,或者从数据库查询在线用户,进行批处理

原代码

vendor/xmo/mine-core/src/Aspect/DeleteCacheAspect.php

image

Thanks for opening your first issue here! Be sure to follow the issue template! 感谢您在这里反馈第一个问题!请务必遵循问题模板!

zds-s commented

历史遗留问题,没有考虑大数据情况。新版这部分已经全部精简,v2用户推荐使用 hyperf 官方提供的 cache 因为不确定还有多少人在使用。所以不对这部分进行删减了