【开源组件】- 关于Jetcache的使用

关于Jetcache的使用

😄生命不息,写作不止
🔥 继续踏上学习之路,学之分享笔记
👊 总有一天我也能像各位大佬一样
🌝分享学习心得,欢迎指正,大家一起学习成长!

在这里插入图片描述

JetCache是由阿里巴巴开源的通用缓存访问框架,是个非常好用的一个开发工具。
GitHub地址:https://github.com/alibaba/jetcache

基本使用

本文简单介绍jetcache的使用,通过引入坐标,再到简单重要的注解的使用。

引入依赖

<dependency>
  <groupId>com.alicp.jetcache</groupId>
  <artifactId>jetcache-starter-redis</artifactId>
  <version>2.7.3</version>
</dependency>

使用的2.7+的版本,需要额外添加该依赖

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>4.3.1</version>
</dependency>

激活注解

需要在启动器类上加上两个注解,EnableMethodCache,EnableCreateCacheAnnotation这两个注解分别激活Cached和CreateCache注解。

@EnableMethodCache(basePackages = "org.nl")
@EnableCreateCacheAnnotation

配置

在application.yml中配置

jetcache:
  statIntervalMinutes: 15
  areaInCacheName: false
  local:
    default:
      type: linkedhashmap
      keyConvertor: fastjson
  remote:
    default:
      type: redis
      keyConvertor: fastjson2
      broadcastChannel: projectA
      valueEncoder: java
      valueDecoder: java
      poolConfig:
        minIdle: 5 # 连接池中的最小空闲连接数
        maxIdle: 20 # 连接池中的最大空闲连接数
        maxTotal: 50 # 连接池中的最大连接数
      host: 127.0.0.1
      port: 6379

jetcache.statIntervalMinutes:这个属性指定了Jetcache统计信息的刷新间隔,单位为分钟。Jetcache会定期收集并更新缓存的统计信息,以便监视缓存的性能和使用情况。
jetcache.areaInCacheName:这个属性用于确定是否将缓存区域(cache area)的名称包括在缓存名称中。
jetcache.local/remote:配置本地缓存,即在应用程序内存中的缓存。或者(配置远程缓存,通常是分布式缓存,如Redis。)
jetcache.local/remote.default.type:本地/远程缓存的类型。这里指定为 linkedhashmap,表示使用LinkedHashMap作为本地缓存的实现。
jetcache.local/remote.default.keyConvertor:用于将本地/远程的缓存键序列化和反序列化的键转换器。这里使用了fastjson,表示使用Fastjson库进行键的转换。
jetcache.remote.default.broadcastChannel:如果您的应用程序需要缓存广播功能,可以指定广播通道的名称。
jetcache.remote.default.valueEncoder:用于将缓存值序列化的值编码器。这里使用了java,表示使用Java序列化来编码缓存值。
jetcache.remote.default.valueDecoder:用于将缓存值反序列化的值解码器。
jetcache.remote.default.poolConfig:配置redis连接池参数

常用方法

@Cached注解

  • name:通过name来指定缓存的唯一名称,不是必须的,如果没有指定,会使用类名+方法名。name会被用于远程缓存的key前缀。可以自己定义,就只是个前缀。
  • key:使用SpEL指定key,如果没有指定会根据所有参数自动生成。会与name进行拼接,可以使用形参的内容来。
  • expire:过期时间

以下以项目中的系统参数来做demo
首先,不设置key,这样会默认将参数的数据作为key,会极大的不友好。

@Cached(name = "paramData.", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);

因为参数是使用了Map来的,会导致redis的key很杂,后续没办法对其进行更新。
在这里插入图片描述

接下来设置一下key值,这里是可以使用SpEL表达式,可以直接输入数字,输入字符串需要加上''。否则会报错,如果使用字符串而没有加上''就会被默认是使用参数字段。

@Cached(name = "paramData.", key = "open", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);

以上是没有''来区分字符串,代码中就会出现SpelEvaluationException错误
在这里插入图片描述

加上''

@Cached(name = "paramData.", key = "'open'", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);

也可以是使用参数,需要注意的是,修改的时候需要去触发修改或者失效。

@CacheUpdate
@CacheInvalidate

@Cached(name = "paramDataCode.", key = "#code", expire = 3600, cacheType = CacheType.REMOTE)
Param findByCode(String code);

加上之后可以在redis中查看,key值就比较清晰易懂。
在这里插入图片描述

也可以使字符串+参数的拼接

@Cached(name = "paramData.", key = "'open' + #page.size + #page.page", expire = 3600, cacheType = CacheType.REMOTE)
IPage<Param> queryPage(Map whereJson, PageQuery page);

那么,如果只是这样创建的话,当数据更新之后,只要没达到过期时间,数据也还是会是旧数据。
jetcache提供了更新的注解,当每次调用了更新方法,就会让对应的缓存数据失效。

@CacheInvalidate(name = "paramData.", key = "'open'")
void update(Param param);

:::info
使用@CacheUpdate和@CacheInvalidate的时候,相关的缓存操作可能会失败(比如网络IO错误),所以指定缓存的超时时间是非常重要的。
:::

@CacheUpdate注解

更新数据注解,当运行该注解下的方法,就会更新所对应的值,如果没有更新,只能等待自动过期。常用参数有:name, key, value,name和key是拼接起来对应在redis的key,value是对应的值,也是需要替换的值。
如以下官方文档

public interface UserService {
    @Cached(name="userCache-", key="#userId", expire = 3600)
    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);
}

当userCache-1的值改动了,就会将新的数据覆盖。
如以下例子,通过code获取参数表中的数据,并缓存起来。

@Cached(name = "paramDataCode.", key = "#code", expire = 3600, cacheType = CacheType.REMOTE)
Param findByCode(String code);

当对其进行更新数据时候,需要把这个缓存中的数据也更新。

@CacheInvalidate(name = "paramData.", key = "'open'")
@CacheUpdate(name = "paramDataCode.", key = "#param.code", value = "#param")
void update(Param param);

@CacheInvalidate注解

@CacheInvalidate是用来使缓存失效的注解,通过name,key来确定失效的缓存。
*分页查询不适合用缓存

@Cached(name = "paramData.", key = "'open'", expire = 3600, cacheType = CacheType.REMOTE)
Page<Param> queryPage(Map whereJson, PageQuery page);

@CacheInvalidate(name = "paramData.", key = "'open'")
void create(Param param);

@CacheRefresh注解

用于配置缓存刷新策略。它可以标注在方法上,表示当缓存失效时,将会触发指定的方法来重新加载缓存数据。

@CacheRefresh(name = "myCache", timeUnit = TimeUnit.MINUTES, refresh = 10)
public void refreshCache(String key);

name = “myCache” 指定了要刷新的缓存名称。
timeUnit = TimeUnit.MINUTES 指定了时间单位为分钟。
refresh = 10 指定了刷新的时间间隔为10分钟。

*注:
方法的返回类型必须是 void。
方法的参数可以是缓存键或与缓存键相关的信息,用于定位需要刷新的缓存项。
方法的参数列表必须与缓存方法(被 @Cached 注解的方法)的参数列表相匹配。

@CachePenetrationProtect注解

用于防止缓存击穿,通过在多个并发请求中只有一个请求去加载数据,其他请求等待加载完成后直接从缓存获取。

@CachePenetrationProtect
@Cached(name = "paramData.", key = "'open' + #page.size + #page.page", expire = 3600, cacheType = CacheType.REMOTE)
@CacheRefresh(refresh = 3, stopRefreshAfterLastAccess = 60*60, refreshLockTimeout = 0)
IPage<Param> queryPage(Map whereJson, PageQuery page);

CacheManager

使用CacheManager可以创建Cache实例,area和name相同的情况下,它和Cached注解使用同一个Cache实例。

注意:在jetcache 2.7 版本CreateCache注解已经废弃,请改用CacheManager.getOrCreateCache(QuickConfig)

使用demo

@Autowired
private CacheManager cacheManager;
private Cache<String, Param> userCache;

@PostConstruct
public void init() {
    QuickConfig qc = QuickConfig.newBuilder("userCache")
            .expire(Duration.ofSeconds(100))
            .cacheType(CacheType.REMOTE) // two level cache
            .syncLocal(true) // invalidate local cache in all jvm process after update
            .build();
    userCache = cacheManager.getOrCreateCache(qc);
}


// 方法内使用
userCache.put("name", param); // 写缓存
System.out.println(userCache.get("name")); // 读缓存

CreateCache注解

可以直接创建缓存实例

@CreateCache(expire = 100)
private Cache<Long, UserDO> userCache;

对应属性表
image.png

总结

本篇记录了笔者在开发中会使用到的注解/方法,对于其字段含义也做了一定的备注。

👍创作不易,如有错误请指正,感谢观看!记得点赞哦!👍

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JetCache 是一个基于 Java开源缓存库,它提供了对方法级缓存的支持。使用 JetCache 可以方便地将方法的结果缓存起来,提高应用程序的性能和响应速度。 下面是使用 JetCache 的基本步骤: 1. 添加 JetCache 依赖:将 JetCache 的依赖项添加到项目的构建文件中(如 Maven 或 Gradle)。 2. 配置缓存:在应用程序的配置文件中,配置需要使用的缓存类型和相关属性。例如,可以配置内存缓存、Redis 缓存等。 3. 注解方法:在需要进行缓存的方法上添加 JetCache 的注解,如 `@Cached`、`@CacheRemove` 等。这些注解可以指定缓存的 key、过期时间、条件等。 4. 使用缓存:在调用被注解的方法时,JetCache 会根据注解的配置自动处理缓存。如果缓存中存在所需数据,则直接返回缓存数据;否则,执行方法并将结果放入缓存。 下面是一个简单的示例: ```java import io.github.jiashunx.cache.Cache; import io.github.jiashunx.cache.annotation.Cached; public class MyService { private Cache<String, String> cache; // 构造函数或依赖注入注入 Cache 实例 @Cached(name = "myCache", key = "#param", expire = 600) public String getData(String param) { // 从数据库或其他数据源中获取数据 // ... return data; } } ``` 在上述示例中,`MyService` 使用JetCache 的 `@Cached` 注解对 `getData` 方法进行了缓存配置。缓存的名称为 "myCache",缓存的 key 使用方法参数 `param`,缓存的过期时间为 600 秒。当调用 `getData` 方法时,JetCache 会自动处理缓存逻辑,如果缓存中存在对应的数据,则直接返回缓存数据;否则,执行方法并将结果放入缓存。 这只是 JetCache 的基本用法,JetCache 还提供了其他更复杂的缓存策略和配置选项,可以根据具体需求进行配置和使用。 希望这个回答对您有帮助!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个有梦有戏的人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值