JetCache多级缓存_zhuyu19911016520-CSDN博客_jetcache 二级缓存

沙海
沙海
沙海
1018
文章
2
评论
2021年4月27日11:46:06
评论
2 3844字阅读12分48秒
摘要

1.JetCache,阿里巴巴开源多级缓存框架
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。 当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。

JetCache多级缓存_zhuyu19911016520-CSDN博客_jetcache 二级缓存

1.JetCache,阿里巴巴开源多级缓存框架

JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。 当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。

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

开源地址:https://github.com/alibaba/jetcache 中文Wiki:https://github.com/alibaba/jetcache/wiki/Home_CN

2.SpringBoot集成

有多种集成方式,此处使用 jetcache-starter-redis-lettuce 思路:本地缓存做为一级缓存,redis为二级缓存和数据源存储,数据不存储在DB了

  • 1.添加maven依赖
<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-starter-redis-lettuce</artifactId>
    <version>2.6.0</version>
</dependency>
12345
  • 2.application.yml 配置 jetcache
jetcache:
  statIntervalMinutes: 15
  areaInCacheName: false
  hidePackages: com.alibaba
  local:
    default:
      type: caffeine
      limit: 300
      keyConvertor: fastjson
      expireAfterWriteInMillis: 100000
  remote:
    default:
      type: redis.lettuce
      keyConvertor: fastjson
      valueEncoder: java
      valueDecoder: java
      poolConfig:
        minIdle: 5
        maxIdle: 20
        maxTotal: 50
      uri: redis://127.0.0.1:6379/
123456789101112131415161718192021
  • 3.在主类上启用缓存注解(很重要)
@EnableMethodCache(basePackages = "com.zypcy.multicache")
@EnableCreateCacheAnnotation
@SpringBootApplication
public class MultiCacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(MultiCacheApplication.class, args);
    }
}
12345678
  • 4.接口与实现,以及一个实体类
public interface IndexService {

    void addUser(User user);
    
    //配置一级缓存
    @Cached(name="userCache-", key="#userId", expire = 60)
    //缓存30秒钟自动刷新,从getUserById方法取一次,如果key在600秒内没有访问则不再自动刷新
    @CacheRefresh(refresh = 30, stopRefreshAfterLastAccess = 600, timeUnit = TimeUnit.SECONDS)
    //当缓存访问未命中的情况下,对并发进行的加载行为进行保护,同一个JVM中同一个key只有一个线程去加载,其它线程等待结果
    @CachePenetrationProtect
    User getUserById(long userId);
 
    //更新缓存
    @CacheUpdate(name="userCache-", key="#user.userId", value="#user")
    void updateUser(User user);
    
    //删除缓存
    @CacheInvalidate(name="userCache-", key="#userId")
    void deleteUser(long userId);
}
1234567891011121314151617181920
@Service
public class IndexServiceImpl implements IndexService {

    private static final String key = "user";
    @Autowired
    StringRedisTemplate redisTemplate;

    @Override
    public void addUser(User user) {
        redisTemplate.opsForHash().put(key , String.valueOf(user.getUserId()) , JSON.toJSONString(user));
    }

    @Override
    public User getUserById(long userId) {
        User user = null;
        Object result = redisTemplate.opsForHash().get(key , String.valueOf(userId));
        if(result != null){
            user = JSON.parseObject(result.toString() , User.class);
        }
        return user;
    }

    @Override
    public void updateUser(User user) {
        User dbUser = getUserById(user.getUserId());
        if(dbUser != null){
            if(!StringUtils.isEmpty(user.getName())){
                dbUser.setName(user.getName());
            }
            if(!StringUtils.isEmpty(user.getAddress())){
                dbUser.setAddress(user.getAddress());
            }
            if(user.getAge() > 0){
                dbUser.setAge(user.getAge());
            }
            addUser(dbUser);
        }
    }

    @Override
    public void deleteUser(long userId) {
        redisTemplate.opsForHash().delete(key , String.valueOf(userId));
    }
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344
public class User implements Serializable {
    private long userId;
    private String name;
    private int age;
    private String address;
    //getter setter 略
}
1234567
  • 5.控制器接口,先请求 add 接口保存数据,再调用 get 接口,然后调用 update 接口,再手动改redis数据源里面的数据测试本地缓存自动刷新
@RestController
@RequestMapping("/index")
public class IndexController {

    @Autowired
    IndexService indexService;

    @PostMapping("/add")
    public String addUser(User user) {
        indexService.addUser(user);
        return "success";
    }

    @GetMapping("/get")
    public User getUserById(long userId) {
        return indexService.getUserById(userId);
    }

    @PostMapping("/update")
    public String  updateUser(User user) {
        indexService.updateUser(user);
        return "success";
    }

    @GetMapping("/delete")
    public String deleteUser(long userId) {
        indexService.deleteUser(userId);
        return "success";
    }
}
123456789101112131415161718192021222324252627282930
  • 6.使用IDEA自带的 HTTP Client --> Test RESTFul Web Service 功能,类似 Postman 一样 JetCache多级缓存_zhuyu19911016520-CSDN博客_jetcache 二级缓存
  • 7.经调用代码发现,每隔30秒会自动调用getUserById方法取一次数据,并刷新一级缓存 JetCache多级缓存_zhuyu19911016520-CSDN博客_jetcache 二级缓存 JetCache多级缓存_zhuyu19911016520-CSDN博客_jetcache 二级缓存
  • 8.源码下载

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: