当前位置: 代码网 > it编程>编程语言>Java > JetCache的配置和注解属性的使用说明

JetCache的配置和注解属性的使用说明

2025年10月27日 Java 我要评论
一、配置说明yml配置文件案例(如果没使用springboot,直接配置globalcacheconfig是类似的,参考快速入门教程):jetcache: statintervalminutes:

一、配置说明

yml配置文件案例(如果没使用springboot,直接配置globalcacheconfig是类似的,参考快速入门教程):

jetcache:
  statintervalminutes: 15
  areaincachename: false
  hidepackages: com.alibaba
  local:
    default:
      type: caffeine
      limit: 100
      keyconvertor: fastjson
      expireafterwriteinmillis: 100000
    otherarea:
      type: linkedhashmap
      limit: 100
      keyconvertor: none
      expireafterwriteinmillis: 100000
  remote:
    default:
      type: redis
      keyconvertor: fastjson
      valueencoder: java
      valuedecoder: java
      poolconfig:
        minidle: 5
        maxidle: 20
        maxtotal: 50
      host: ${redis.host}
      port: ${redis.port}
    otherarea:
      type: redis
      keyconvertor: fastjson
      valueencoder: kryo
      valuedecoder: kryo
      poolconfig:
        minidle: 5
        maxidle: 20
        maxtotal: 50
      host: ${redis.host}
      port: ${redis.port}

配置通用说明如下:

属性默认值说明
jetcache.statintervalminutes0统计间隔,0表示不统计
jetcache.areaincachenametruejetcache-anno把cachename作为远程缓存key前缀,2.4.3以前的版本总是把areaname加在cachename中,因此areaname也出现在key前缀中。2.4.4以后可以配置,为了保持远程key兼容默认值为true,但是新项目的话false更合理些。
jetcache.hiddenpackages@cached和@createcache自动生成name的时候,为了不让name太长,hiddenpackages指定的包名前缀被截掉
jetcache.[local|remote].${area}.type缓存类型。tair、redis为当前支持的远程缓存;linkedhashmap、caffeine为当前支持的本地缓存类型
jetcache.[local|remote].${area}.keyconvertorkey转换器的全局配置,当前只有一个已经实现的keyconvertor:fastjson。仅当使用@createcache且缓存类型为local时可以指定为none,此时通过equals方法来识别key。方法缓存必须指定keyconvertor
jetcache.[local|remote].${area}.valueencoderjava序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
jetcache.[local|remote].${area}.valuedecoderjava序列化器的全局配置。仅remote类型的缓存需要指定,可选java和kryo
jetcache.[local|remote].${area}.limit100每个缓存实例的最大元素的全局配置,仅local类型的缓存需要指定。注意是每个缓存实例的限制,而不是全部,比如这里指定100,然后用@createcache创建了两个缓存实例(并且注解上没有设置locallimit属性),那么每个缓存实例的限制都是100
jetcache.[local|remote].${area}.expireafterwriteinmillis无穷大以毫秒为单位指定超时时间的全局配置(以前为defaultexpireinmillis)
jetcache.local.${area}.expireafteraccessinmillis0需要jetcache2.2以上,以毫秒为单位,指定多长时间没有访问,就让缓存失效,当前只有本地缓存支持。0表示不使用这个功能。

上表中${area}对应@cached和@createcache的area属性。注意如果注解上没有指定area,默认值是"default"。

关于缓存的超时时间,有多个地方指定,澄清说明一下:

  1. put等方法上指定了超时时间,则以此时间为准
  2. put等方法上未指定超时时间,使用cache实例的默认超时时间
  3. cache实例的默认超时时间,通过在@createcache和@cached上的expire属性指定,如果没有指定,使用yml中定义的全局配置,例如@cached(cachetype=local)使用jetcache.local.default.expireafterwriteinmillis,如果仍未指定则是无穷大

二、注解属性说明

jetcache方法缓存和springcache比较类似,它原生提供了ttl支持,以保证最终一致,并且支持二级缓存。jetcache2.4以后支持基于注解的缓存更新和删除。

在spring环境下,使用@cached注解可以为一个方法添加缓存,@cacheupdate用于更新缓存,@cacheinvalidate用于移除缓存元素。注解可以加在接口上也可以加在类上,加注解的类必须是一个spring bean,例如:

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);
}

key使用spring的spel脚本来指定。如果要使用参数名(比如这里的key="#userid"),项目编译设置target必须为1.8格式,并且指定javac的-parameters参数,否则就要使用key="args[0]"这样按下标访问的形式。

@cacheupdate和@cacheinvalidate的name和area属性必须和@cached相同,name属性还会用做cache的key前缀。

@cached注解和@createcache的属性非常类似,但是多几个:

属性默认值说明
area“default”如果在配置中配置了多个缓存area,在这里指定使用哪个area
name未定义指定缓存的唯一名称,不是必须的,如果没有指定,会使用类名+方法名。name会被用于远程缓存的key前缀。另外在统计中,一个简短有意义的名字会提高可读性。
key未定义使用spel指定key,如果没有指定会根据所有参数自动生成。
expire未定义超时时间。如果注解上没有定义,会使用全局配置,如果此时全局配置也没有定义,则为无穷大
timeunittimeunit.seconds指定expire的单位
cachetypecachetype.remote缓存的类型,包括cachetype.remote、cachetype.local、cachetype.both。如果定义为both,会使用local和remote组合成两级缓存
locallimit未定义如果cachetype为local或both,这个参数指定本地缓存的最大元素数量,以控制内存占用。如果注解上没有定义,会使用全局配置,如果此时全局配置也没有定义,则为100
localexpire未定义仅当cachetype为both时适用,为内存中的cache指定一个不一样的超时时间,通常应该小于expire
serialpolicy未定义指定远程缓存的序列化方式。可选值为serialpolicy.java和serialpolicy.kryo。如果注解上没有定义,会使用全局配置,如果此时全局配置也没有定义,则为serialpolicy.java
keyconvertor未定义指定key的转换方式,用于将复杂的key类型转换为缓存实现可以接受的类型,当前支持keyconvertor.fastjson和keyconvertor.none。none表示不转换,fastjson可以将复杂对象key转换成string。如果注解上没有定义,会使用全局配置。
enabledtrue是否激活缓存。例如某个dao方法上加缓存注解,由于某些调用场景下不能有缓存,所以可以设置enabled为false,正常调用不会使用缓存,在需要的地方可使用cachecontext.enablecache在回调中激活缓存,缓存激活的标记在threadlocal上,该标记被设置后,所有enable=false的缓存都被激活
cachenullvaluefalse当方法返回值为null的时候是否要缓存
condition未定义使用spel指定条件,如果表达式返回true的时候才去缓存中查询
postcondition未定义使用spel指定条件,如果表达式返回true的时候才更新缓存,该评估在方法执行后进行,因此可以访问到#result

@cacheinvalidate注解说明:

属性默认值说明
area“default”如果在配置中配置了多个缓存area,在这里指定使用哪个area,指向对应的@cached定义。
name未定义指定缓存的唯一名称,指向对应的@cached定义。
key未定义使用spel指定key
condition未定义使用spel指定条件,如果表达式返回true才执行删除,可访问方法结果#result

@cacheupdate注解说明:

属性默认值说明
area“default”如果在配置中配置了多个缓存area,在这里指定使用哪个area,指向对应的@cached定义。
name未定义指定缓存的唯一名称,指向对应的@cached定义。
key未定义使用spel指定key
value未定义使用spel指定value
condition未定义使用spel指定条件,如果表达式返回true才执行更新,可访问方法结果#result

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

@cacherefresh注解说明:

属性默认值说明
refresh未定义刷新间隔
timeunittimeunit.seconds时间单位
stoprefreshafterlastaccess未定义指定该key多长时间没有访问就停止刷新,如果不指定会一直刷新
refreshlocktimeout60秒类型为both/remote的缓存刷新时,同时只会有一台服务器在刷新,这台服务器会在远程缓存放置一个分布式锁,此配置指定该锁的超时时间

@cachepenetrationprotect注解:

当缓存访问未命中的情况下,对并发进行的加载行为进行保护。 当前版本实现的是单jvm内的保护,即同一个jvm中同一个key只有一个线程去加载,其它线程等待结果。

对于以上未定义默认值的参数,如果没有指定,将使用yml中指定的全局配置,全局配置请参考配置说明

到此这篇关于jetcache的配置和注解属性的使用说明的文章就介绍到这了,更多相关jetcache 配置和注解属性内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com