Spring思維導圖,讓Spring不再難懂(cache篇)

關於快取

快取是實際工作中非常常用的一種提高效能的方法。而在java中,所謂快取,就是將程式或系統經常要呼叫的物件存在記憶體中,再次呼叫時可以快速從記憶體中獲取物件,不必再去建立新的重複的例項。這樣做可以減少系統開銷,提高系統效率。

在增刪改查中,資料庫查詢佔據了資料庫操作的80%以上,而非常頻繁的磁碟I/O讀取操作,會導致資料庫效能極度低下。而資料庫的重要性就不言而喻了:

資料庫通常是企業應用系統最核心的部分

資料庫儲存的資料量通常非常龐大

資料庫查詢操作通常很頻繁,有時還很複雜

在系統架構的不同層級之間,為了加快訪問速度,都可以存在快取

Spring思維導圖,讓Spring不再難懂(cache篇)

spring cache特性與缺憾

現在市場上主流的快取框架有ehcache、redis、memcached。spring cache可以透過簡單的配置就可以搭配使用起來。其中使用註解方式是最簡單的。

Spring思維導圖,讓Spring不再難懂(cache篇)

Cache註解

Spring思維導圖,讓Spring不再難懂(cache篇)

從以上的註解中可以看出,雖然使用註解的確方便,但是缺少靈活的快取策略,

快取策略:

TTL(Time To Live ) 存活期,即從快取中建立時間點開始直到它到期的一個時間段(不管在這個時間段內有沒有訪問都將過期)

TTI(Time To Idle) 空閒期,即一個數據多久沒被訪問將從快取中移除的時間

專案中可能有很多快取的TTL不相同,這時候就需要編碼式使用編寫快取。

條件快取

根據執行流程,如下@Cacheable將在執行方法之前( #result還拿不到返回值)判斷condition,如果返回true,則查快取;

@Cacheable(value = “user”, key = “#id”, condition = “#id lt 10”)  public User conditionFindById(final Long id)

如下@CachePut將在執行完方法後(#result就能拿到返回值了)判斷condition,如果返回true,則放入快取

@CachePut(value = “user”, key = “#id”, condition = “#result。username ne ‘zhang’”)  public User conditionSave(final User user)

如下@CachePut將在執行完方法後(#result就能拿到返回值了)判斷unless,如果返回false,則放入快取;(即跟condition相反)

@CachePut(value = “user”, key = “#user。id”, unless = “#result。username eq ‘zhang’”)  public User conditionSave2(final User user)

如下@CacheEvict, beforeInvocation=false表示在方法執行之後呼叫(#result能拿到返回值了);且判斷condition,如果返回true,則移除快取;

@CacheEvict(value = “user”, key = “#user。id”, beforeInvocation = false, condition = “#result。username ne ‘zhang’”) public User conditionDelete(final User user)

小試牛刀,綜合運用:

@CachePut(value = “user”, key = “#user。id”) public User save(User user) { users。add(user); return user; } @CachePut(value = “user”, key = “#user。id”) public User update(User user) { users。remove(user); users。add(user); return user; } @CacheEvict(value = “user”, key = “#user。id”) public User delete(User user) { users。remove(user); return user; } @CacheEvict(value = “user”, allEntries = true) public void deleteAll() { users。clear(); } @Cacheable(value = “user”, key = “#id”) public User findById(final Long id) { System。out。println(“cache miss, invoke find by id, id:” + id); for (User user : users) { if (user。getId()。equals(id)) { return user; } } return null; }

配置ehcache與redis

spring cache整合ehcache,spring-ehcache。xml主要內容:

net。sf。ehcache ehcache-core ${ehcache。version}

<!—— Spring提供的基於的Ehcache實現的快取管理器 ——> <!—— 如果有多個ehcacheManager要在bean加上p:shared=“true” ——> <!—— cache註解,和spring-redis。xml中的只能使用一個 ——>

spring cache整合redis,spring-redis。xml主要內容:

org。springframework。data spring-data-redis 1。8。1。RELEASE org。apache。commons commons-pool2 2。4。2 redis。clients jedis 2。9。0

<!—— 注意需要新增Spring Data Redis等jar包 ——>redis配置 <!—— JedisConnectionFactory ——> <!——spring cache——> <!—— 預設快取10分鐘 ——> <!—— cacheName 快取超時配置,半小時,一小時,一天 ——> <!—— shiro cache keys ——> <!—— cache註解,和spring-ehcache。xml中的只能使用一個 ——>

專案中註解快取只能配置一個,所以可以透過以下引入哪個配置檔案來決定使用哪個快取。

<!—— ——>

當然,可以透過其他配置搭配使用兩個快取機制。比如ecache做一級快取,redis做二級快取。

Spring思維導圖,讓Spring不再難懂(cache篇)

更加詳細的使用與配置,可以參考專案中spring-shiro-training中有關spring cache的配置。

https://git。oschina。net/wangzhixuan/spring-shiro-training。git

寫在最後,希望對在java開發路上的你,有些幫助!

碼農三哥,一名普通程式設計師,會點java軟體開發,對AI人工智慧有點興趣,後續會每日分享些關於網際網路技術方面的文章,感興趣的朋友可以關注我,一起交流學習。

想轉型或剛步入程式設計師Java開發的朋友,有問題可以留言或私信我。

再次感謝你的閱讀!