慢接口优化
一、场景
绑定角色和权限接口,当一个角色绑定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模糊匹配优化去说。