Spring Boot中使用JetCache

Spring Boot中使用JetCache

  • 1. 什么是JetCache
  • 2. JetCache的基本使用方式
      • 2.1 配置文件
      • 2.2 代码实例
        • 2.2.1 创建缓存实例
        • 2.2.2 创建方法缓存
  • 3. JetCache使用注意的问题

1. 什么是JetCache

JetCache是一个基于Java的缓存系统封装,提供统一的API和强大的注解来简化缓存的使用。原生支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。

全部特性:

  • 通过统一的API访问Cache系统
  • 通过注解实现声明式的方法缓存,支持TTL和两级缓存
  • 通过注解创建并配置Cache实例
  • 针对所有Cache实例和方法缓存的自动统计
  • Key的生成策略和Value的序列化策略是可以配置的
  • 分布式缓存自动刷新,分布式锁 (2.2+)
  • 异步Cache API (2.2+,使用Redis的lettuce客户端时)

2. JetCache的基本使用方式

这里主要讲述Spring boot中的JetCache使用方式

2.1 配置文件

pom文件


     com.alicp.jetcache
     jetcache-starter-redis
     2.5.11

在(resources)资源文件目录下新建一个springboot风格的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
      password: 123456

2.2 代码实例

在代码中有2种方式实现缓存

2.2.1 创建缓存实例

通过@CreateCache注解创建一个缓存实例,然后像操作map一样操作这个缓存实例,默认缓存时间是100秒

public interface UserService {

    User getUserById(Long userId);

    void updateUser(User user);

    void deleteUser(Long userId);
}

@Service
public class UserServiceImpl implements UserService {

    @CreateCache(name = "user_cache_", expire = 3600, cacheType = CacheType.BOTH, localLimit = 50)
    private Cache userCache;

    @Override
    public User getUserById(Long userId) {
        User user = userCache.get(userId);
        if (user != null) {
            return user;
        }
        user = new User(userId, "张杰", 18);
        userCache.put(userId, user);
        return user;
    }

    @Override
    public void updateUser(User user) {
        userCache.put(user.getUserId(), user);
        System.out.println("updateUser:" + user);
    }

    @Override
    public void deleteUser(Long userId) {
        userCache.remove(userId);
        System.out.println("deleteUser :" + userId);
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
    private static final long serialVersionUID = 220401161187822517L;

    private Long userId;
    private String name;
    private Integer age;
}

2.2.2 创建方法缓存

使用@Cached方法为一个方法添加上缓存。JetCache通过Spring AOP生成代理,来支持缓存功能。注解可以加在接口方法上也可以加在类方法上,但需要保证是个Springbean。

public interface StudentService {

    @Cached(name = "student_cache_", key = "#id", expire = 3600)
    Student getStudentById(Long id);

    @CacheUpdate(name = "student_cache_", key = "#id", value = "#student")
    void updateStudent(Student student);

    @CacheInvalidate(name = "student_cache_", key = "#id")
    void deleteStudent(Long id);
}

@Service
public class StudentServiceImpl implements StudentService {

    @Override
    public Student getStudentById(Long userId) {
        return new Student(userId, "张杰", 18);
    }

    @Override
    public void updateStudent(Student user) {
        System.out.println("updateUser:" + user);
    }

    @Override
    public void deleteStudent(Long userId) {
        System.out.println("deleteUser :" + userId);
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student implements Serializable {
    private static final long serialVersionUID = -6832900779447088497L;

    private Long id;
    private String name;
    private Integer age;
}

3. JetCache使用注意的问题

  • 运行报错:java.lang.NoSuchMethodError: redis.clients.jedis.JedisPool.(Lorg/apache/commons/pool2/impl/GenericObjectPoolConfig;Ljava/lang/String;IILjava/lang/String;ILjava/lang/String;Z)V
    遇到这种错误原因是依赖包jedis版本太低,你需要引入新版本的jedis:

   redis.clients
   jedis
   2.9.0

  • @CreateCache注解创建缓存实例无效,执行时缓存实例一直是null,原因是jetcache版本问题,我原本使用的是2.5.3版本,后来换了2.5.11版本就好了

你可能感兴趣的:(Spring,Boot)