慢接口优化

一、场景

  绑定角色和权限接口,当一个角色绑定300多个权限时,优化之前耗时8s,优化之后耗时300ms。角色-权限:1-N

二、问题分析

  接口逻辑:1、需要先删除修改之前角色和权限的关联关系(批量删除)

          2、重新建立提交的角色和权限的关联关系(批量插入)

                  3、需要删除对应用户是否拥有涉及权限的redis缓存

  思路:查阅代码发现,问题可能出在两个地方:一是代码中使用到mybatis-plus的批量插入saveBatch(),可能并非一次性插入多条数据,而是循环N次逐条插入关联关系数据导致插入速度过慢;

     二是删除用户权限缓存时,对应每个权限进行模糊匹配做到基于权限-用户细粒度模糊删除redisKey:permission-appId(不同应用对应的id)-code(接口权限code码)-*(指该权限所属应用关联的所有用户缓存),当插入300多条权限时,需要forEach遍历模糊删除300次导致速度过慢

  解决方案:一、批量插入过慢

       通过调用接口时,IDEA的console页面打印的sql发现,insert xxx语句多次重复出现,说明并非一次插入多条数据,而是循环N次逐条插入。

          修改方法:1.在配置文件数据库url属性后添加&rewriteBatchedStatements=true

           2.使用mybatis-plus预留的insertBatchSomeColumn()方法,主要步骤为在通用mapper/serviceimpl中引入该方法,具体操作可参加思维导图或链接:https://blog.csdn.net/qi_ming_hao_nan/article/details/118729240

      二、redis缓存删除太慢

      代码中的问题主要是粒度过细,其实没必要对于每个权限逐一删除,只需要基于permission-appId-*删除,即对该应用下所有的权限缓存模糊删除,优化速度明显,面试的时候建议结合前文写的redis模糊匹配优化去说。

 

posted @ 2022-10-31 22:20  重生之我是java程序员  阅读(166)  评论(0编辑  收藏  举报