『壹』 為什麼@Cacheable只能作用於public方法源碼這樣設計有什麼道理嗎
一般註解的解析都是通過反射來完成的,在顫並反射的時候如果方法是private修飾的話,沖慎那麼就得暴力反射,設置取消許可權檢查,這樣可能會帶來很多問題,所以,散洞敬一般都是public修飾,這樣反射的時候好調用
如有疑問請追問,滿意請採納,謝謝
『貳』 CACHEABLE在計算機里是什麼意思
分類: 電腦衫拿/網路 >> 反病毒
解析:
CACHE在岩旁計算機里是高速緩存的意思,ABLE在英語里就是起作用的意思,所以合起來就是使高速緩存起作用的意思,這個單詞或棗搭在BIOS(CMOS)設置中經常可以看到
『叄』 Druid連接池源碼解析(8)DruidPooledStatement
本來以為pool包收尾了,掃了一下發現還有statement,這塊比較簡單,是對JDBC的Statement進行了一些封裝,實現了與連接池對應的功能,看下類圖:
DruidPooledStatement 中最重要的就是execute開頭的一系列方法了,是執行SQL的本體,都是對JDBC的Statement的增強,主要多做了以下:
DruidPooledPreparedStatement實現了JDBC的PreparedStatement,是執行預編譯的SQL用,跟Connection相同,引入了PreparedStatementHolder這樣一個Holder類,同樣定義了一些統計屬性,其中有個屬性pooling,是否池化,引出了PreparedStatementPool,裡面用LinkedHashMap實現了LRU,一個cache類用來緩存預編譯過的statement;
cache的key定義了一個類,PreparedStatementKey,重寫了hashcode和equals方法,很有意思地參考了String的hashcode,用了31這個質數作進制來計算hash,且不僅僅是sql語句相同,需要其他屬性都相同才算相同,貼一下源碼:
CallableStatement是用來執行函數或者存儲過程的,在當下的大環境笑銀下,用得真的很少就略過了吧。
druid在JDBC的statement基礎上,封裝了一些類來擴展自己的屬性和功能,一般在工程環境下,基本就用AOP或者裝飾器模式來實腔辯現(感覺這個Holder有點像裝飾器,又有點像單例的Holder)的,寫框架的時候,這種方式還碰圓宴是很值得借鑒的,很內聚、高效,也沒有額外的引用
cache的使用很巧妙,但是在刷文章的時候看到過一個問題,雖然在後續版本中修復了,但還是分享一下:
探究Druid連接池「違反協議」異常
這個問題拋的是SQL異常,問題卻出在緩存上,對與緩的狀態和刷新策略,有了新的認識
『肆』 Android:深入剖析圖片載入庫Glide緩存功能(源碼分析)
Glide 需要緩存的 圖片資源 分為兩類:
Glide 的緩存機制使得 Glide 具備非常好的圖片緩存效果,從而使得具備較高的圖片載入效率。
下面,我將根據 Glide 緩存流程中的每個步驟 進行源碼分析。
至此, Glide 的圖片緩存 Key 生成完畢。
至此,創建好了緩存對象 LruResourceCache
即:
源碼分析如下:
若上述兩個方法都沒獲取到緩存圖片時(即內存緩存里沒有該圖片的緩存),就開啟新線程載入圖片。
若無法從 內存緩存 里 獲得緩存的圖片, Glide 就會採用第2級緩存:磁碟緩存 去獲取緩存圖片
寫入 內存緩存分為:寫入 弱引用緩存 & LruCache 演算法的緩存
寫入 LruCache 演算法 內存緩存的原理:包含圖片資源 resource 的 EngineResource 對象的一個引用機制:
所以:
至此,實現了:
至此, Glide 的圖片緩存流程解析完畢。
Android圖片載入的那些事:為什麼你的Glide 緩存沒有起作用?
不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度 。
『伍』 springboot @Cacheable 基本使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
@Cacheable :
對方法結果進行緩存(主要用於GET方法)
cacheNames/value:指定緩存主鍵(Cache)的名字
key:緩存數據使用key,支持spEl語法
keyGenerator:key的生成器。與key屬性沖突,自定義 keyGenerator 必須實現
org.springframework.cache.interceptor.KeyGenerator,default使用默認的參數值生成器
cacheManager:指定緩存管理器,或者cacheResolver指定獲取解析器cacheResolver:與
CacheManager沖突condition:指定條件滿足才緩存,與unless相反。可以使用spEL語法
unless:否定緩存,當滿足條件時,結果不被緩存。可以獲取到結果(#result)進行判斷。支持spEL語法
sync:是否非同步模式。在該模式下unless不被支持。default=false
@CachePut:先調用方法,在對結果進行緩存。(主要用於PUT方法),需要注意key的設置@CacheEvict:默認先調用方法,在刪除緩存(主要用於DELETE方法)allEntries: 刪除緩存組件中(cacheNames/value指定)所有的值beforeInvocation:在方法執行之前刪除值,default=false@Caching:組合註解。針對復雜情況@CacheConfig:載入類上,用於設置緩存的共有屬纖好兆性
幾個屬性:
cacheNames/values:指定緩存組件的名字,將方法的返回結果放在哪個緩存中,是數組的方式,可以指定多個緩存
key:緩存數據使用毀租的key;襪稿可以用它來指定。默認是使用方法參數的值
可以用spEL表達式來表示;#id-如(getEmp[1]); 參數id的值: #a0 #p0 #root.args[0]
keyGenerator:key的生成器;可以自己指定key的生成器的組件id
key/keyGenerator:二選一使用(自己配置類)
cacheManager:指定使用哪個緩存管理器;或者cacheResolver指定獲取解析器
condition:指定符合條件的情況下才緩存; 如:condition = "#a0>1" 即第一個參數值大於1時才進行緩存
unless:否定緩存;當unless指定的條件為true,方法的返回值就不會被緩存;可以獲取到的結果進行判斷
如: unless = 「#a0」:如果第一個參數值是2,則結果不緩存 unless = 「#result == null」 結果為null不緩存結合寫法:
@Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#a0>1",unless = "#a0==2") 意思為 放在的緩存名稱為emp中,key的生成方式為配置的myKeyGenerator類,當第一個參數大於1時候緩存,當第一個參數等於2時不緩存
sync:是否使用非同步模式(非同步模式情況下unless不支持)
//@Cacheable(cacheNames = {"emp"},key = "#root.methodName+'['+#id+']'")
public Employee getEmp(Integer id){
System.out.println("查詢"+id+"號員工");
Employee emp = employeeMapper.getEmpById(id);
return emp;
}
此時當id為1時,key的值為 getEmp[1]
@Configuration
public class MyCacheConfig {
@Bean("myKeyGenerator")
public KeyGenerator keyGenerator (){
return new KeyGenerator(){
@Override
public Object generate(Object o, Method method, Object... objects) {
return method.getName()+"["+ Arrays.asList(objects).toString()+"]";
}
};
};
}
這里返回的key的值為getEmp[[1]]