JetCache快速入门指南:高效Java缓存解决方案

JetCache快速入门指南:高效Java缓存解决方案

什么是JetCache

JetCache是一个基于Java的缓存框架,由阿里巴巴开源,提供了统一的缓存访问API和注解驱动的缓存操作方式。它支持多种缓存后端(如Redis、内存缓存等),并能轻松实现多级缓存架构,是提升Java应用性能的利器。

核心概念

在开始使用JetCache前,需要了解几个核心概念:

  1. Cache实例:表示一个具体的缓存容器,类似于Map结构
  2. 方法缓存:通过注解自动缓存方法返回值
  3. 多级缓存:支持本地缓存+远程缓存的多级结构
  4. 缓存区域(Area):用于逻辑隔离不同的缓存数据

创建Cache实例

使用@CreateCache注解可以快速创建Cache实例。下面是一个典型示例:

@Autowired
private CacheManager cacheManager;

private Cache<Long, UserDO> userCache;

@PostConstruct
public void init() {
    QuickConfig qc = QuickConfig.newBuilder("userCache")
        .expire(Duration.ofSeconds(100))  // 设置缓存过期时间
        //.cacheType(CacheType.BOTH)      // 创建两级缓存
        //.localLimit(100)                // 本地缓存元素数量限制
        //.syncLocal(true)                // 更新后同步失效其他JVM的本地缓存
        .build();
    userCache = cacheManager.getOrCreateCache(qc);
}

创建后可以像使用Map一样操作缓存:

// 获取缓存
UserDO user = userCache.get(123L);
// 放入缓存
userCache.put(123L, user);
// 移除缓存
userCache.remove(123L);

方法缓存

JetCache提供了声明式的方法缓存,通过@Cached注解可以轻松实现方法返回值的缓存:

public interface UserService {
    @Cached(name="UserService.getUserById", expire = 3600)
    User getUserById(long userId);
}

关键点:

  • 注解可以加在接口方法或类方法上
  • 所在类必须是Spring管理的Bean
  • name属性用于统计信息,建议使用类名+方法名的格式
  • expire设置缓存过期时间(秒)

Spring Boot集成配置

对于Spring Boot项目,集成JetCache非常简单:

  1. 添加依赖:
<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-starter-redis</artifactId>
    <version>${jetcache.latest.version}</version>
</dependency>
  1. 配置application.yml:
jetcache:
  statIntervalMinutes: 15       # 统计信息输出间隔
  areaInCacheName: false        # 是否在缓存名中包含area信息
  local:
    default:
      type: linkedhashmap       # 本地缓存类型
      keyConvertor: fastjson    # key转换器
  remote:
    default:
      type: redis               # 远程缓存类型
      keyConvertor: fastjson2   # key转换器
      broadcastChannel: projectA # 广播通道名
      valueEncoder: java        # 值编码方式
      valueDecoder: java       # 值解码方式
      poolConfig:              # 连接池配置
        minIdle: 5
        maxIdle: 20
        maxTotal: 50
      host: 127.0.0.1          # Redis地址
      port: 6379               # Redis端口
  1. 启动类配置:
@SpringBootApplication
@EnableMethodCache(basePackages = "com.company.mypackage")
@EnableCreateCacheAnnotation
public class MySpringBootApp {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApp.class);
    }
}

非Spring Boot项目配置

对于不使用Spring Boot的项目,可以通过Java Config方式配置:

  1. 添加核心依赖:
<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-anno</artifactId>
    <version>${jetcache.latest.version}</version>
</dependency>
<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-redis</artifactId>
    <version>${jetcache.latest.version}</version>
</dependency>
  1. Java配置类:
@Configuration
@EnableMethodCache(basePackages = "com.company.mypackage")
@EnableCreateCacheAnnotation
@Import(JetCacheBaseBeans.class)
public class JetCacheConfig {

    @Bean
    public Pool<Jedis> pool(){
        GenericObjectPoolConfig pc = new GenericObjectPoolConfig();
        pc.setMinIdle(2);
        pc.setMaxIdle(10);
        pc.setMaxTotal(10);
        return new JedisPool(pc, "localhost", 6379);
    }

    @Bean
    public GlobalCacheConfig config(Pool<Jedis> pool){
        Map localBuilders = new HashMap();
        EmbeddedCacheBuilder localBuilder = LinkedHashMapCacheBuilder
                .createLinkedHashMapCacheBuilder()
                .keyConvertor(FastjsonKeyConvertor.INSTANCE);
        localBuilders.put(CacheConsts.DEFAULT_AREA, localBuilder);

        Map remoteBuilders = new HashMap();
        RedisCacheBuilder remoteCacheBuilder = RedisCacheBuilder
                .createRedisCacheBuilder()
                .keyConvertor(Fastjson2KeyConvertor.INSTANCE)
                .valueEncoder(JavaValueEncoder.INSTANCE)
                .valueDecoder(JavaValueDecoder.INSTANCE)
                .broadcastChannel("projectA")
                .jedisPool(pool);
        remoteBuilders.put(CacheConsts.DEFAULT_AREA, remoteCacheBuilder);

        GlobalCacheConfig globalCacheConfig = new GlobalCacheConfig();
        globalCacheConfig.setLocalCacheBuilders(localBuilders);
        globalCacheConfig.setRemoteCacheBuilders(remoteBuilders);
        globalCacheConfig.setStatIntervalMinutes(15);
        globalCacheConfig.setAreaInCacheName(false);

        return globalCacheConfig;
    }
}

最佳实践建议

  1. 缓存命名规范:使用"类名.方法名"的格式命名方法缓存,便于维护和监控
  2. 合理设置过期时间:根据数据变更频率设置合适的过期时间
  3. 多级缓存使用:高频访问但变更较少的数据适合使用LOCAL+BOTH类型
  4. 监控统计:定期检查缓存命中率等统计信息,优化缓存策略
  5. 键设计:使用有意义的键结构,避免冲突

常见问题

  1. 缓存穿透:对不存在的key也进行缓存,避免频繁查询数据库
  2. 缓存雪崩:设置不同的过期时间,避免大量缓存同时失效
  3. 缓存一致性:使用@CacheUpdate和@CacheInvalidate保持缓存与数据源同步

JetCache通过简洁的API和强大的注解支持,让Java应用的缓存实现变得简单高效。无论是简单的内存缓存还是复杂的分布式缓存场景,JetCache都能提供良好的解决方案。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾霓立Delightful

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值