使用@CacheEvict 注解 缓存查询数据

    /**
     * 查询所有菜单。
     * 请思考,菜单数据会经常变化吗,假如每次访问菜单数据都查数据库
     * 是否会对数据库带来一定的访问压力。即便是没有压力,那访问数据库
     * 的性能相对于直接访问内存,是不是会低一些?我们能否将查询到的
     * 数据在缓存放一份,下一次再取时,从数据库取。
     * @return
     */

在这里插入图片描述
在这里插入图片描述

第一步 在启动类上添加注解

@EnableCaching
其目的 启动spring boot 工程中的内置缓存 提高查询性能

package com.cy;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@EnableCaching
@SpringBootApplication
public class AdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }
}

第二步 在业务层上添加注解
	@Cacheable("sysMenu") //缓存应用的切入点方法(底层AOP)
    @Override
    public List<SysMenu> findMenus() {
        //从缓存取,缓存有则直接返回
        //假如缓存没有,则去查数据库,然后将查询到结果存储到缓存
        return sysMenuDao.selectMenus();
    }

测试: 使用Controller 中设定的url 进行查询 服务器端没有 日志的产生,原因是查询到的参数存入到了缓存中,缓存中有直接去缓存中去取,如果缓存中没有则进行访问,和maven 的下载机制类似。

第三步 数据不一致解决

描述: 使用先使用get 的url获取数据 获取成功后在进行update 进行修改,修改完成后在使用get的 url请求数据,发现两者的信息不匹配。

解决方案 在业务层添加注解

在执行 update 修改时,对缓存进行清理,解决

    /**
     * @CacheEvict注解描述方法时,表示方法是一个清缓存的切入点方法
     * 这里的value属性值表示要清除的缓存,allEntries=true表示要清除当前value
     * 属性指向的cache中所有数据
     * 
     * 
     */
    @CacheEvict(value="sysMenu",allEntries = true,beforeInvocation = false)
    @Override
    public int updateMenu(SysMenu entity) {
        return sysMenuDao.updateMenu(entity);
    }

更新 或 新增的同时清理相应的缓存数据,查询的频率相对来说是最高的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值