@Cacheable注解不生效

本文探讨了在同一类中使用@Cacheable注解时遇到的问题,即缓存未能生效的情况,并提出了两种解决方案:一是直接使用Redis工具包进行缓存操作;二是将缓存逻辑移到类外。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到了一个情况 就是同一个类中 A调用B有@Cacheable B的数据没有进入缓存中

一开始不理解啊

如代码:


    /**
      *查找出操作人员角色级别最高值
      * @param adminId
      * @return Integer
      * @author zhangjunrong
      * @date 2022/3/29 15:27
      */
    @Cacheable(cacheNames = "role",key = "level+#adminId")
    public  Integer checkLevel(Long adminId) {
        //1.先找出他的全部角色
        QueryWrapper<AdminRole> wrapper = new QueryWrapper<>();
        //中间表 admin_mid_role 查出role_id
        String queryRoleId="select role_id from yqs.admin_mid_role where admin_id="+adminId;
        wrapper.select("role_level")
                .inSql("pk_id",queryRoleId);
        //2.筛选出最高级别的数 1 max
        Integer level= null;
        try {
            level = Collections.min(adminRoleMapper.selectList(wrapper).stream().filter(Objects::nonNull).map(AdminRole::getRoleLevel).collect(Collectors.toList()));
        } catch (Exception e) {
            throw new YqsException(MessageEnum.NO_PERMISSION.getCode(),"该工作人员没有角色");
        }
        return level;
    }

 @Override
    public List<AdminRole> queryRoles(Long adminId) {
        //查出自己角色的最高的等级
        Integer level = checkLevel(adminId);
        System.err.println(level);
        QueryWrapper<AdminRole> wrapper = new QueryWrapper<>();
        //排除比自己高等级的
        wrapper.gt("role_level",level);
        return adminRoleMapper.selectList(wrapper);
    }

然后呢结果

到网上查找了点

说跟@Transactional有点相同 切面AOP原理 

因为@Cacheable 是使用AOP 代理实现的 ,通过创建内部类来代理缓存方法,这样就会导致一个问题,类内部的方法调用类内部的缓存方法不会走代理,不会走代理,就不能正常创建缓存,所以每次都需要去调用数据库

解决方法:

1.直接用工具包RedisUtils 去放缓存里

redisUtil.set("roleLevel:"+adminId,level);

2.把该方法放缓存方法放其他地方去

  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新生代农民工-小王八

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值