Springboot集成JetCache

        最近在学习缓存技术,暂时了解到可做缓存的有Spring Cache,mybatis自带的缓存和JetCache等等。因为JetCache是阿里系的,而且教程看起来也相当容易上手和简便,因为就先学习了JetCache,来记录下学到的东西。

        JetCache源码地址:

JetCache: JetCache 是一个基于 Java 的缓存系统封装,提供统一的 API 和注解来简化缓存的使用

首先需要确保电脑安装了redis并开启了redis。安装教程请看其他网友的贴子啦。

pom引入:


    com.alicp.jetcache
    jetcache-starter-redis
    2.6.0

启动和配置:

@SpringBootApplication
@EnableMethodCache(basePackages = "com.hyz.provider")
@EnableCreateCacheAnnotation
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

application.yml:

jetcache:
  statIntervalMinutes: 15
  areaInCacheName: false
  local:
    default:
      type: linkedhashmap
      keyConvertor: fastjson
      limit: 100
  remote:
    default:
      type: redis
      keyConvertor: fastjson
      valueEncoder: java
      valueDecoder: java
      poolConfig:
        minIdle: 5
        maxIdle: 20
        maxTotal: 50
      host: 127.0.0.1
      port: 6379

测试用例:

package com.hyz.provider.service;

import com.alicp.jetcache.anno.CacheInvalidate;
import com.alicp.jetcache.anno.CacheUpdate;
import com.alicp.jetcache.anno.Cached;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hyz.provider.entity.IdCard;
import com.hyz.provider.mapper.IdCardMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;


@Service
public class IdCardService extends ServiceImpl {

    @Autowired
    IdCardMapper idCardMapper;

    @Cached(name="idCardCache-", key="#id", expire = 3600,condition = "result!=null")
    public IdCard getById(String id){
        System.out.println("--查询详情--");
        LambdaQueryWrapper query=new LambdaQueryWrapper<>();
        query.eq(IdCard::getId,id);
        return this.getOne(query);
    }
    
    @CacheUpdate(name="idCardCache-", key="#idCard.id", value="#idCard",condition = "result==true")
    public Boolean create(IdCard idCard){
        return this.saveOrUpdate(idCard);
    }

    @CacheInvalidate(name="idCardCache-", key="#id",condition = "result==true")
    public Boolean deleteIdCard(String id){
        LambdaUpdateWrapper updateWrapper=new UpdateWrapper().lambda();
        updateWrapper.set(IdCard::getDeleteAt, LocalDateTime.now())
                .eq(IdCard::getId,id);
        return this.update(new IdCard(),updateWrapper);
    }
}

由于我的代码是集成了mybatis-plus,所以实际测试还是以自己为准就行。

@Cached用于创建一个缓存,@CacheUpdate用于更新缓存,@CacheInvalidate用于使缓存失效

        这里说说我遇到的两个问题,第一个问题就是,condition是判断什么情况下才执行该缓存,但我当时不知道如何通过condition获取方法的返回值,再去判断,这里谢谢这位网友的分享,我才知道写法,能够用result来获取返回值。

springcloud2 jetcache配置和使用总结_fengzhaoyang的专栏-CSDN博客_jetcache配置

        第二个问题就是,一开始,我是通过另外一个方法去调用这个带有缓存注解的方法,但是测试下都不生效,代码例子如下:

    public void updateIdCard(IdCard idCard){
        this.create(idCard);
    }
    
    @CacheUpdate(name="idCardCache-", key="#idCard.id", value="#idCard",condition = "result==true")
    public Boolean create(IdCard idCard){
        return this.saveOrUpdate(idCard);
    }

Controller调用了Service的updateIdCard方法的时候,缓存没有更新到,发现这种情况有两种解决办法,一种是在updateIdCard上也加上更新缓存的注解,一种是直接调用这个create方法。原因应该是和注解的特性有关,具体还要看看资料,这里就不多叙述了。

        以上就是一个比较基础的springboot集成JetCache方法,JetCache还有很多其他的用法,有兴趣的可以去其他网友的分享里看看了。

你可能感兴趣的:(java,spring,boot)