205. jetcache:你需要知道的小技巧

【视频&交流平台】

àSpringBoot视频http://t.cn/R3QepWG

à SpringCloud视频http://t.cn/R3QeRZc

à Spring Boot源码:https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台:http://412887952-qq-com.iteye.com/blog/2321532

à Spring Boot Shiro视频http://t.cn/R3QDMbh

à Spring Boot 2.0 之Spring Data 和JPAhttp://t.cn/R1pSojf

说明

(1)Spring Boot 版本:2.0.3.RELEASE

(2)jetcache版本:2.5.2

(3)JDK:1.8

前言

在前一篇文章中介绍了在Spring Boot中怎么使用JetCache,但是对于实际的使用这是不够的,本篇文章就讲讲一些小技巧。

在写之前,祝大家父亲节快乐,记得给爸爸打个电话,问声好。有你在,才是梦开始的地方。

一、缓存name的指定

对于@CreateCache指定的缓存对象,默认生成的缓存的key的名称是:

c.k.j.d.c.TestCacheInstanceController.cache100

对于@Cached指定的方法缓存,默认生成的缓存的key的名称是:

c.k.j.d.s.ArticleTypeService.getById(J)[102]

那么如何指定呢?

@Cached(name="ArticleType.getById")public ArticleType getById(long id){}

缓存的名称name,不是必须的,如果没有指定,会使用类名+方法名。name会被用于远程缓存的key前缀。另外在统计中,一个简短有意义的名字会提高可读性。

二、缓存失效时间

这个Spring Cache这个就不能指定,未来官方是否会支持呢,给官方提个issue吧。

JetCache就是可以设置的:

@Cached(name="ArticleType.getById",expire=3600)public ArticleType getById(long id) {}

该Cache实例的默认超时时间定义,注解上没有定义的时候会使用全局配置,如果此时全局配置也没有定义,则取无穷大。缓存失效时间单位是秒,3600秒=1小时。

当然失效时间的单位,你可以通过属性timeUnit(TimeUnit.SECONDS )重新定义的。

三、二级缓存

这里的缓存是内存+远程缓存:

@Cached(name="ArticleType.getById",expire=3600,cacheType=CacheType.BOTH)public ArticleType getById(long id) {}

这里通过cacheType属性,可以设置缓存方式,可选值:

LOCAL:内存缓存,只会存在内存中,并不会存储到redis中。

REMOTE:远程缓存。

BOTH:内存缓存+远程缓存。

四、内存中的元素个数限制

对于内存中的缓存,是需要控制缓存的个数的,缓存个数过多的话,很有可能就会内存溢出了,那么对于JetCache是可以设置内存缓存的个数的:

@Cached(name="ArticleType.getById",expire=3600,cacheType=CacheType.LOCAL,localLimit=2)public ArticleType getById(long id) {}

如果cacheType为CacheType.LOCAL或CacheType.BOTH,这个参数指定本地缓存的最大元素数量,以控制内存占用。注解上没有定义的时候会使用全局配置,如果此时全局配置也没有定义,则取100。

五、非堵塞的获取一个锁

AutoReleaseLock tryLock(K key, long expire, TimeUnit timeUnit)boolean tryLockAndRun(K key, long expire, TimeUnit timeUnit, Runnable action)

非堵塞的尝试获取一个锁,如果对应的key还没有锁,返回一个AutoReleaseLock,否则立即返回空。如果Cache实例是本地的,它是一个本地锁,在本JVM中有效;如果是redis等远程缓存,它是一个不十分严格的分布式锁。锁的超时时间由expire和timeUnit指定。多级缓存的情况会使用最后一级做tryLock操作。用法如下:

  // 使用try-with-resource方式,可以自动释放锁  try(AutoReleaseLock lock = cache.tryLock("MyKey",100, TimeUnit.SECONDS)){     if(lock != null){        // do something     }  }

上面的代码有个潜在的坑是忘记判断if(lock!=null),所以一般可以直接用tryLockAndRun更加简单:

  boolean hasRun = tryLockAndRun("MyKey",100, TimeUnit.SECONDS), () -> {    // do something  };

tryLock内部会在访问远程缓存失败时重试,会自动释放,而且不会释放不属于自己的锁,比你自己做这些要简单。当然,基于远程缓存实现的任何分布式锁都不会是严格的分布式锁,不能和基于ZooKeeper或Consul做的锁相比。

六、大写API

V get(Kkey)这样的方法虽然用起来方便,但有功能上的缺陷,当get返回null的时候,无法断定是对应的key不存在,还是访问缓存发生了异常,所以JetCache针对部分操作提供了另外一套API,提供了完整的返回值,包括:

CacheGetResult<V> GET(K key);MultiGetResult<K, V> GET_ALL(Set<? extends K> keys);CacheResult PUT(K key, V value);CacheResult PUT(K key, V value, long expireAfterWrite, TimeUnit timeUnit);CacheResult PUT_ALL(Map<? extends K, ? extends V> map);CacheResult PUT_ALL(Map<? extends K, ? extends V> map, long expireAfterWrite, TimeUnit timeUnit);CacheResult REMOVE(K key);CacheResult REMOVE_ALL(Set<? extends K> keys);CacheResult PUT_IF_ABSENT(K key, V value, long expireAfterWrite, TimeUnit timeUnit);

这些方法的特征是方法名为大写,与小写的普通方法对应,提供了完整的返回值,用起来也稍微繁琐一些。例如:

CacheGetResult<ArticleType> result = cache.GET(articleType.getId());if(result.isSuccess()) {    ArticleType articleType2 = result.getValue();    System.out.println(articleType2);}else if(result.getResultCode() == CacheResultCode.NOT_EXISTS) {     System.out.println("cache miss:" + articleType.getId());}else if(result.getResultCode() == CacheResultCode.EXPIRED) {     System.out.println("cache expired:" + articleType.getId());}else {    System.out.println("cache get error:" + articleType.getId());}

好了本篇文章就介绍到这里。


历史相关文章:

203. 阿里jetcache

204. jetcache:在Spring Boot中怎么玩?

微信公众号「SpringBoot」最近更新:

214. Spring Security:概述
213.Spring Boot 2.0新特性:配置绑定
212. Spring Boot WebFlux:响应式Spring Data之MongoDB
211. Spring Boot WebFlux:使用篇
210. Spring Boot WebFlux:概念篇
Java8新特性:Stream:实战篇
为了更勇敢,你可以害怕@一禅小和尚
Java8新特性:Stream:基础篇
Java8新特性:方法引用
209. SpringBoot quartz:sqlserver启动只有 DECLARE CURSOR 才允许使用...
风口之上,我是那头猪嘛?
Java8新特性:Lambda表达式: 摸摸里面
Java8新特性:Lambda表达式:过关斩将:使用场景
Java8新特性:Lambda表达式:小试牛刀
下雨天,适合学「Spring Boot」
Java8新特性:接口的默认方法
208. Spring Boot Swagger2:排序 – 漂游记
207. Spring Boot Swagger2:极简方式
我读的书很多,但都没有你好看【一禅录】
206. Spring Boot 2.0 Swagger2:使用
205. Spring Boot 2.0 Swagger2:初识Swagger
当要离开的时候,我却动情了
205. jetcache:你需要知道的小技巧
204. jetcache:在Spring Boot中怎么玩?

搜索「springboot」或者扫描以下二维码即可关注:

原文地址:https://www.cnblogs.com/springboot-wuqian/p/9904465.html

时间: 2024-08-01 19:27:44

205. jetcache:你需要知道的小技巧的相关文章

每个程序员都会的 35 个 jQuery 小技巧

1 收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 2 1. 禁止右键点击 3 $(document).ready(function(){ 4 $(document).bind("contextmenu",function(e){ 5 return false; 6 }); 7 }); 8 2. 隐藏搜索文本框文字 9 Hide when clicked in the search field, the value.(example can be found belo

做预解释题的一点小方法和小技巧

在JavaScript中的函数理解中预解释是一个比较难懂的话题.原理虽然简单,寥寥数言,但其内涵却有深意,精髓难懂.如何在轻松活跃的头脑中将它学会,现在针对我在学习中的一点小窍门给大家分享一下,希望能给大家一些帮助: 万事需遵循"原理"--"预解释"无节操和"this"指向:(可先看例题解析然后结合原理进行学习) (感谢蕾蕾老师给归纳的预解释无节操原理:) 如果函数传参数则先于以下执行,就相当于在函数私有作用域下var了一个变量:根据作用域原理,

给你一个云端的大脑01:印象笔记小技巧

我在上课时,很多学员们给我的反馈都是:老师你讲的太精彩啦,但我记不住.我最重视的就是学员的反馈,因为我是一个完美主义者,凡事既然做就要做到最好.而学员就像我的一面镜子,反馈是我改进的方向. 很久以前,我听到这样的反馈第一反应就是自己还是讲得不够好,但后来我的讲课都能hold住全场300多人的时候,我发现这个反馈仍然频繁出现,这不是我的问题而是学员们不会学习的问题,这样的学员在工作中也是缺乏自我培养的能力. 所以从今天起,我的平台又加入一个主题:给你一个云端的大脑.告诉你如何记笔记,如何整理大脑记

思科命令配置小技巧三:alias 命令

大家都用过手机上的快捷拨号设置 思科设备是否支持命令的快捷键定义呢 答案是肯定的 suzhouxiaoniu(config)#alias exec xx show ip inter bri  xx是自定义的快捷键名称,可以是数字 suzhouxiaoniu#xx 直接敲定义好的名称Interface                  IP-Address      OK? Method Status                ProtocolFastEthernet1/0          

思科命令配置小技巧四:用ACL控制debug 输出

使用debug命令可以帮助我们TS,但是使用debug命令往往会输出一大堆信息,很多是我们不需要用的,也会造成CPU高负荷,这种情况下我们可以限制debug的输出 可以应用ACL到debug以限定仅输出要求的debug信息. 如仅查看从1.1.1.1到1.1.1.2的ICMP包: Router(config)# access-list 100 permit icmp host 1.1.1.1 host 1.1.1.2 Router# debug ip packet detail 100 思科命令

在Axure中使用FontAwesome替换你的网站图标[axure小技巧]

你是不是还在为你的网站做一个很小的图标而忙碌着?你是不是还在为找一个图标导出百度或者谷歌?你有没有想过可以用字体来做一个图标代替普通的图片图标?这两天给公司做案例,由于自己又对设计不熟悉,寻找图标的苦差可不是很好做.同事分享了一个用字体代替图片做网站图标的资源,在此非常感谢!Font Awesome,原只为Bootstrap而设计的字体图标,不过,现在你可以单独用它来为你的网站工作.丢掉图片图标吧,跟我一起来用Font Awesome. 使用方法: 1. 下载 Font Awesome 官方网站

Fiddler小技巧-测试上传文件接口&多参数并传情况

写了多年的API了,fidder还真是方便至极相对于postman来说. 两种常用方式: 抓包:app通过代理方式,就可以在pc端看到fidder的请求了 因为会监控好多跟我们需要的没关系的HTTP请求, 就要开启过滤了 主动调试API&上传文件参数&其它参数 拷贝点击"upload file"上传之后自动生成的body然后修改: ---------------------------acebdf13572468 Content-Disposition: form-da

移动端样式小技巧

平时在移动端开发拼页面的过程中总会遇到一些问题,主要是各手机webview样式显示效果不一致造成的.以下总结了一些常见坑和一些小技巧,希望对看官有所帮助! 本文只针对两大手机阵营 Android和IOS 中的魅蓝metal 和 iPhone6进行样式对比. 一.line-height line-height经常用于文字居中,当然也有小伙伴会用上下padding去写.but!不管你用padding还是line-height,不同手机显示效果还是-不一样. 一般会这样写 .demo{ height:

Windows Phone开发(8):关于导航的小技巧

前文用几个例子对导航做了简单介绍,在一般应用中,使用上一篇文章中说到的方法,其实也够用了,不过,为了能够处理一些特殊的情况,有几个小技巧还是有必要了解一下的. 一.到底该不该设置"后退"操作?因为手机的硬件层就有一个"回退"按钮,按理说我们不需要在程序中再添加什么回退按钮之类的,不过,还是有必要看看如何手动加入回退功能. 1.新建一个WP应用项目.2.除默认的主页外,新建一个页面Page2.xaml.3.在主页上放一个按钮,编写Click事件处理代码,导航到Page