SpringBoot中的缓存

整合redis;引入redis的starter spring-boot-starter-data-redis
测试缓存
cachemanageer==cache缓存组件来实际给缓存中存取数据
1.引入redis的starter容器保存的时rediscachemanager
2.rediscachemanager帮我们创建rediscache来作为缓存组件,rediscacahe通过操作redis缓存数据
3.默认保存数据k-v利用序列化保存应当使用json保存:引入redis的starter,cachemanager变为rediscachemanager
默认创建的rediscachemanager操作redis的时候使用的是redistemplate<object,object>默认使用的是jdk序列化机制
因此需要自定义cachemanager

在main方法上加上@EnableCaching注解

@SpringBootApplication
@MapperScan("cn.ncu.springbootcache.mapper")
@EnableCaching
public class SpringbootCacheApplication {

   public static void main(String[] args) {
       SpringApplication.run(SpringbootCacheApplication.class, args);
   }

}

缓存注解介绍以及使用(Service层):

@CacheConfig(cacheNames = "emp")//抽取缓存公共配置
@Service
public class EmployeeService {

    @Resource
    EmpMapper empMapper;
    /*
    将方法的运行结果进行缓存,以后再要相同的数据直接可以从缓存中获取,不再调用方法,不用调用数据库进行查询了
     CacheManager:管理多个cache组件,对于真正的crud操作在cache组件中,每一个缓存组件中有自己唯一一个名字
    @Cacheable的几个属性:
        cacheNames/value:缓存的名字:,将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存
        key:缓存数据使用的key,可以用它来指定,默认使用是方法的值,举例键值对:1-方法的返回值
            编写SpEl比如#id就是参数id的值 #a0 #p0 #root.args[0]
            举例:getEmp[2]=>key="#root.methodName+'['+#id+']'"
        keyGenerator:key的生成器:可以自己指定key的生成器组件id,key/keyGenerator二选一 编写MyCacheConfig配置类 keyGenerator = "myKeyGenerator"
        cacheManager:指定缓存管理器:或者cacheReslover缓存解析器,这两个也是二选一
        condition:指定符合条件的情况下,才缓存; condition = "#id>0"或者condition = "#a0>1":第一个参数的值大于1时才缓存
        unless:否定缓存,当unless指定的条件weitrue,方法的返回值就不会被缓存(除非),unless在使用时可以获取到结果进行判断
            unless="#result==null" unless = "#a0==2":如果第一个参数的值为2结果不缓存
        sync:是否使用异步
        调用方法之前先看缓存中有没有指定key要用的数据,如果没有再调方法


     */
    @Cacheable(cacheNames = {"emp"})//keyGenerator = "myKeyGenerator",condition = "#a0>1"
    public Employee getEmpByid(Integer id){
        Employee employee=empMapper.getEmpById(id);
        System.out.println("查询:"+id+"号员工");
        return employee;
    }
    /**
     * @CachePut:既调用方法又更新缓存,同步更新缓存
     * 修改了数据库的某个数据同时更新缓存;
     * 运行时机
     * 1.先调用方法
     * 2.将目标方法的结果缓存起来
     * 测试步骤:
     *1.先查询1号员工,查到的结果会放在缓存中
     * 2.以后查询还是之前的结果
     * 3.更新一号员工
     * 4.再次查询1号员工发现还是之前的数据,这是因为1号员工在缓存中没有进行更新(key不一样),需要指定key
     * key = "#employee.id":使用传入的参数的员工id key="result.id":使用返回后的id,这两种写法都一样
     */
    @CachePut(value = "emp",key = "#employee.id")
    public Employee updateEmp(Employee employee){
        empMapper.updateEmp(employee);
        System.out.println("updateEmp:"+employee);
        return employee;
    }
    /**
     * @CacheEvict:缓存清除
     * 通过key指定要清除的数据
     * ,allEntries = true:缓存数据都删除
     * ,beforeInvocation =false:缓存的清除是否在方法执行之前执行,默认代表是在方法执行之后执行,如果出现异常缓存就不会被清除
     * beforeInvocation =true:无论方法是否出现异常缓存都会被清除
     */
    @CacheEvict(value = "emp",key = "#id" )
    public void deleteEmp(Integer id){
        System.out.println("delete:"+id);
        empMapper.deleteEmp(id);
    }
    //定义复杂的缓存注解
    @Caching(
            cacheable = {
                    @Cacheable(value = "emp",key = "#lastName")
            },
            put = {
                    @CachePut(value = "emp",key = "#result.id"),
                    @CachePut(value = "emp",key = "#result.email")
            }

    )
    public Employee getEmpByLastName(String lastName){
        return empMapper.getEmpBylastName(lastName);
    }
}
```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值