valarchie / AgileBoot-Back-End

🔥 规范易于二开的全栈基础快速开发脚手架。🔥 采用Springboot + Vue 3 + Typescript + Mybatis Plus + Redis + 更面向对象的业务建模 + 面向生产的项目(非玩具项目)。你的 ⭐️ Star ⭐️,是作者更新的动力! 欢迎小伙伴PR,一起构建一个规范的全栈项目~😆
MIT License
1.82k stars 356 forks source link

看了下缓存相关的代码,觉得太分离了 #32

Open cwt9562 opened 1 year ago

cwt9562 commented 1 year ago

直接在UserApplicationService的相关查询方法里,默认直接调用缓存的方法,会不会好一点? UserApplicationService里的查询方法是没缓存的,想要走缓存要通过CacheCenter 这样子很容易误调用了没缓存的查询方法

valarchie commented 1 year ago

你的意思是 XXXApplication的查询 类似用@cachable注解 默认用缓存?

这样子很容易误调用了没缓存的查询方法 XXXXApplication里面一般不会调用其他XXXApplication同层级的方法

cwt9562 commented 1 year ago

我的意思是 UserApplicationService里的部分查询方法,自身实现就自动调用cacheCenter里的部分缓存

valarchie commented 1 year ago

如何自动调用cacheCenter的缓存? 你这边建议的实现方案是?

cwt9562 commented 1 year ago

我举个例子 com.agileboot.domain.system.user.UserApplicationService#getUserProfile 这个方法,就没有读取缓存

    public UserProfileDTO getUserProfile(Long userId) {

        SysUserEntity userEntity = userService.getById(userId);
        SysPostEntity postEntity = userService.getPostOfUser(userId);
        SysRoleEntity roleEntity = userService.getRoleOfUser(userId);

        return new UserProfileDTO(userEntity, postEntity, roleEntity);
    }

而它又被/system/user/profile接口调用了 com.agileboot.admin.controller.system.SysProfileController#profile 也就意味着该接口是无缓存的

如果想将该接口修改为有缓存的,按我看到你原本代码的思路,应该是在SysProfileController的profile方法里,去调用CacheCenter的部分类、方法 但是我觉得,直接在UserApplicationService的getUserProfile里,去调用userCache的缓存,替代userService.getById(userId);,好像更好一点

valarchie commented 1 year ago

SysProfileController 直接作为控制层,不应该包含什么逻辑。 你说的是对的,缓存要在UserApplicationService去调用。

但是一般项目中 没有必要所有地方都走缓存,比如这个Profile接口,一般是用户登录时请求一次。不走缓存的话也是没问题的。

缓存优化应该是具体场景具体分析,项目只是给了一个小例子,如果遇到大批量数据,可以Mybatis Plus配置缓存,或者ApplicationService里面去使用缓存。

预估到会有性能问题的接口,再优化也行,不用全盘走缓存。