【Java】- 缓存之JetCache基础篇

Java缓存之JetCache

  • 写在前面
    • 为什么使用缓存
    • 使用场景
  • 简介
  • 特性
  • 缓存类型-两级缓存
    • 本地缓存
    • 远程(访问Redis的客户端)
  • 区别
    • Spring Cache:
    • JetCache
  • 常用注解
    • @Cached
    • @CacheInvalidate
    • @CacheUpdate
    • @CreateCache
    • @CacheRefresh

写在前面

为什么使用缓存

在高并发、大流量等场景下,降低系统延迟,缓解数据库压力,提高系统整体的性能,也能够让用户有更好的体验;

使用场景

读多写少、不追求强一致性

简介

JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作;
当前有四个实现:RedisCache、RedisLettuceCache、CaffeineCache、LinkedHashMapCache;

特性

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

缓存类型-两级缓存

本地缓存

  • LinkedHashMap:使用LinkedHashMap做LUR方式淘汰
  • Caffeine:基于Java8开发的提供了近乎最佳命中率的高性能的缓存库
  • PS:选择了本地缓存请设置limit,全局默认设置了100,本地缓存的数据存放于内存,减轻内存的损耗,如果使用了Caffeine,缓存的key过多可能导致内存溢出

远程(访问Redis的客户端)

  • Redis:使用Jedis客户端,Redis官方首选的Java客户端
  • RedisLettuce:使用Lettuce客户端,一个高性能基于Java的Redis驱动框架,支持线程安全的同步、异步操作,底层集成了Project Reactor,提供反应式编程;
  • PS:选择了远程缓存请设置keyPrefix,保证存放至Redis的缓存key规范化,避免与其他系统出现冲突

区别

Spring Cache:

  • 优点

    • 支持开箱即用(Out Of The Box),并提供基本的Cache抽象,方便切换各种底层Cache
    • 通过Cache注解即可实现缓存逻辑透明化,让开发者关注业务逻辑
    • 当事务回滚时,缓存也会自动回滚
    • 支持比较复杂的缓存逻辑
    • 提供缓存编程的一致性抽象,方便代码维护
  • 缺点

    • Spring Cache并不针对多进程的应用环境进行专门的处理;
    • Spring Cache抽象的操作中没有锁的概念,当多线程并发操作(更新或者删除)同一个缓存项时,有可能读取到过期的数据
    • 无法满足本地缓存和远程缓存同时使用,使用远程缓存时无法自动刷新

JetCache

  • 优点
    • 远程缓存和内存型缓存可以共存,当共存时,优先访问内存,保护远程缓存;也可以只用某一种;
    • 自动刷新策略,防止某个缓存失效,访问量突然增大时,所有机器都去访问数据库,可能导致数据库挂掉
    • 利用不严格的分布式锁,对同一key,全局只有一台机器自动刷新
  • 缺点:
    • JetCache通过Spring AOP生成代理,来支持缓存功能

常用注解

@Cached

  • @Cached:是在接口方法或者类方法上添加缓存,一般以参数为key,以返回值为value存入缓存中
    可配置cacheType参数:REMOTE, LOCAL, BOTH
    LOCAL时可配置localLimit参数来设置本地local缓存的数量限制,condition参数可配置在什么情况下使用缓存,condition和key支持SPEL语法;
  • @CreateCache是直接创建一个缓存实例,然后调用put(T key, T value)、get(T key)等方法实现缓存
  • Cache实例的默认超时时间,通过在@CreateCache和@Cached上的expire属性指定,如果没有指定,则使用yml中定义的全局配置

@CacheInvalidate

@CacheInvalidate:缓存失效,同样可配置condition满足的情况下失效缓存,但不能支持是在方法调用前还是调用后将缓存失效;

@CacheUpdate

@CacheUpdate:缓存更新,value为缓存更新后的值,此操作是调用原方法结束后将更新缓存

@CreateCache

@CreateCache:用于字段上的注解,创建缓存,根据参数,创建一个name的缓存,可以全局显式使用这个缓存参数对象

@CacheRefresh

@CacheRefresh:自动刷新策略,可设置refresh、stopRefreshAfterLastAccess、refreshLockTimeout参数;

更多详细配置说明介绍,可仔细查看文档:https://github.com/alibaba/jetcache/wiki/MethodCache_CN

你可能感兴趣的:(【Java篇】,缓存,java,redis)