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 和JPA:http://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」或者掃描以下二維碼即可關注:
?
?
posted on 2018-11-04 16:30 悟纖 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/springboot-wuqian/p/9904465.html
總結
以上是生活随笔為你收集整理的205. jetcache:你需要知道的小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 硬盘盘符无法识别或已损坏,别急着格式化
- 下一篇: 2018-2019-1 20165226