當前位置:首頁 » 硬碟大全 » springcash緩存時間
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

springcash緩存時間

發布時間: 2023-01-20 03:32:08

Ⅰ SpringCache優化、緩存一致性、多級緩存

先記錄一些綱要

1、SpringCache是寫庫之後更新的策略,對緩存一致性的不太友好

2、繼承RedisCacheManager重寫createRedisCache,繼承RedisCache重寫put

3、緩存一致性有兩個方案,一個是先寫庫再刪除緩存、第二個是先刪除緩存再寫庫。

先寫庫再刪除緩存配合超時時間一般沒啥問題,極端的情況遇到緩存失效,線程讀庫和加緩存之間,完成了一次寫庫和刪緩存的操作,導致加的緩存是舊的。總結就是讀中加入了一次寫。A讀庫 B寫庫 B刪緩存 A加緩存。

先刪緩存再寫庫的話,是寫中加入了一次讀。A刪緩存 B讀庫 B加緩存 A寫庫A。這個概率比上面的大。

這兩種方案的問題的解決方式是一樣的,就是延時雙刪策略。即:

刪緩存 寫庫 延時再次刪除緩存(需超過一次讀庫的時間,可以新啟線程完成)

或者 寫庫 刪緩存 延時再次刪除緩存(需超過一次讀庫的時間,可以新啟線程完成)

如果有主從讀寫分離,需要將延時再加上主從同步的時間。

還有個第二次刪除失敗的問題,這個問題可以通過消息中間件,反復嘗試進行。或者通過訂閱binlog,反復進行。

多級緩存可以參考阿里開源的JetCache的實現

後面會給出demo和源碼解析。

Ⅱ Spring本地緩存的使用方法

我們現在在用的Spring Cache,可以直接看Spring Boot提供的緩存枚舉類,有如下這些:

EhCache:一個純Java的進程內緩存框架,所以也是基於本地緩存的。(注意EhCache2.x和EhCache3.x相互不兼容)。
Redis:分布式緩存,只有Client-Server(CS)模式,Java一般使用Jedis/Luttuce來操縱。
Hazelcast:基於內存的數據網格。雖然它基於內存,但是分布式應用程序可以使用Hazelcast進行分布式緩存、同步、集群、處理、發布/訂閱消息等。
Guava:它是Google Guava工具包中的一個非常方便易用的本地化緩存實現,基於LRU(最近最少使用)演算法實現,支持多種緩存過期策略。在Spring5.X以後的版本已經將他標記為過期了。
Caffeine:是使用Java8對Guava緩存的重寫版本,在Spring5中將取代了Guava,支持多種緩存過期策略。
SIMPLE:使用ConcurrentMapCacheManager,因為不支持緩存過期時間,所以做本地緩存基本不考慮該方式。

關於分布式緩存,我們需要後面會專門討論Redis的用法,這里只看本地緩存。性能從高到低,依次是Caffeine,Guava,ConcurrentMapCacheManager,其中Caffeine在讀寫上都快了Guava近一倍。

這里我們只討論在Spring Boot裡面怎麼整合使用Caffeine和EhCache。

主要有以下幾個步驟:

1)加依賴包:

2)配置緩存:
這里有兩種方法,通過文件配置或者在配置類裡面配置,先看一下文件配置,我們可以寫一個properties文件,內容像這樣:

然後還要在主類中加上@EnableCaching註解:

另外一種更靈活的方法是在配置類中配置:

應用類:

測試類:

導入依賴包,分為2.x版本和3.x版本。
其中2.x版本做如下導入:

3.x版本做如下導入:

導包完成後,我們使用JCacheManagerFactoryBean + ehcache.xml的方式配置:

參考資料:

https://blog.csdn.net/f641385712/article/details/94982916

http://www.360doc.com/content/17/1017/20/16915_695800687.shtml

Ⅲ spring一級緩存和二級緩存的區別是什麼

一級緩存:
就是Session級別的緩存。一個Session做了一個查詢操作,它會把這個操作的結果放在一級緩存中。
如果短時間內這個session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級緩存中拿,而不會再去連資料庫,取數據。
它是內置的事務范圍的緩存,不能被卸載。
二級緩存:
就是SessionFactory級別的緩存。顧名思義,就是查詢的時候會把查詢結果緩存到二級緩存中。
如果同一個sessionFactory創建的某個session執行了相同的操作,hibernate就會從二級緩存中拿結果,而不會再去連接資料庫。
這是可選的插件式的緩存,在默認情況下,SessionFactory不會啟用這個插件。
可以在每個類或每個集合的粒度上配置。緩存適配器用於把具體的緩存實現軟體與Hibernate集成。
嚴格意義上說,SessionFactory緩存分為兩類:內置緩存和外置緩存。我們通常意義上說的二級緩存是指外置緩存。
內置緩存與session級別緩存實現方式相似。前者是SessionFactory對象的一些集合屬性包含的數據,後者是指Session的一些集合屬性包含的數據
SessionFactory的內置緩存中存放了映射元數據和預定義SQL語句。
映射元數據是映射文件中數據的拷貝;
而預定義SQL語句是在Hibernate初始化階段根據映射元數據推導出來。
SessionFactory的內置緩存是只讀的,應用程序不能修改緩存中的映射元數據和預定義SQL語句,因此SessionFactory不需要進行內置緩存與映射文件的同步。
Hibernate的這兩級緩存都位於持久化層,存放的都是資料庫數據的拷貝。
緩存的兩個特性:
緩存的范圍
緩存的並發訪問策略
1、緩存的范圍
決定了緩存的生命周期以及可以被誰訪問。緩存的范圍分為三類。
事務范圍
進程范圍
集群范圍
註:
對大多數應用來說,應該慎重地考慮是否需要使用集群范圍的緩存,因為訪問的速度不一定會比直接訪問資料庫數據的速度快多少。
事務范圍的緩存是持久化層的第一級緩存,通常它是必需的;進程范圍或集群范圍的緩存是持久化層的第二級緩存,通常是可選的。
2、緩存的並發訪問策略
當多個並發的事務同時訪問持久化層的緩存的相同數據時,會引起並發問題,必須採用必要的事務隔離措施。
在進程范圍或集群范圍的緩存,即第二級緩存,會出現並發問題。
因此可以設定以下四種類型的並發訪問策略,每一種策略對應一種事務隔離級別。
事務型並發訪問策略是事務隔離級別最高,只讀型的隔離級別最低。事務隔離級別越高,並發性能就越低。
A 事務型:僅僅在受管理環境中適用。它提供了Repeatable Read事務隔離級別。
對於經常被讀但很少修改的數據,可以採用這種隔離類型,因為它可以防止臟讀和不可重復讀這類的並發問題。
B 讀寫型:提供了Read Committed事務隔離級別。僅僅在非集群的環境中適用。
對於經常被讀但很少修改的數據,可以採用這種隔離類型,因為它可以防止臟讀這類的並發問題。
C 非嚴格讀寫型:不保證緩存與資料庫中數據的一致性。
如果存在兩個事務同時訪問緩存中相同數據的可能,必須為該數據配置一個很短的數據過期時間,從而盡量避免臟讀。
對於極少被修改,並且允許偶爾臟讀的數據,可以採用這種並發訪問策略。
D 只讀型:對於從來不會修改的數據,如參考數據,可以使用這種並發訪問策略。
什麼樣的數據適合存放到第二級緩存中?
1、很少被修改的數據
2、不是很重要的數據,允許出現偶爾並發的數據
3、不會被並發訪問的數據
4、參考數據
不適合存放到第二級緩存的數據?
1、經常被修改的數據
2、財務數據,絕對不允許出現並發
3、與其他應用共享的數據。
Hibernate的二級緩存策略的一般過程如下:
1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的數據對象。
2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢資料庫,把結果按照ID放入到緩存。
4) 刪除、更新、增加數據的時候,同時更新緩存。
註:
Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query緩存。
Query緩存策略的過程如下:
1) Hibernate首先根據這些信息組成一個Query Key,Query Key包括條件查詢的請求一般信息:SQL, SQL需要的參數,記錄范圍(起始位置rowStart,最大記錄個數maxRows),等。
2) Hibernate根據這個Query Key到Query緩存中查找對應的結果列表。如果存在,那麼返回這個結果列表;如果不存在,查詢資料庫,獲取結果列表,把整個結果列表根據Query Key放入到Query緩存中。
3) Query Key中的SQL涉及到一些表名,如果這些表的任何數據發生修改、刪除、增加等操作,這些相關的Query Key都要從緩存中清空。

Ⅳ Spring如何配置資料庫查詢緩存/對象緩存EHCache

  1. 在ehcache.xml文件中配置查詢緩存參數,ehcache.xml文件配置如下:

<ehcache>

<!--diskStore元素,配置一個目錄,這個目錄用來存放數據,
也就是說,如果EhCache需要把數據寫入磁碟,將會寫到這個目錄下-->
<diskStorepath="java.io.tmpdir"/>

<defaultCache
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskPersistent="false"
="120"/>

<cachename="ehcacheName"
maxElementsInMemory="3000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="36000"
overflowToDisk="true"
/>
</ehcache>

2. spring的配置

第一步:給指定方法配置緩存/src/main/resources/applicationContext-resources.xml

<ehcache:proxyid="userGroupServiceProxy"refId="userGroupService">
<ehcache:cachingcacheName="cash15Min"methodName=""/>
<ehcache:cachingcacheName="cash15Min"methodName=""/>
<ehcache:cachingcacheName="cash15Min"methodName="selectuserGroupById"/>
</ehcache:proxy>

配置參數的含義如下:
id:唯一標識符
refId:需要配置緩存的service或者controller
cacheName:緩存名稱
methodName:需要緩存的方法,這個方法必須是shoppingHomeService中的方法
第二步:在控制器中注入依賴的緩存userGroupServiceProxy /src/main/webapp/WEB-INF/dispatcher-servlet.xml

<beanid="PFController"class="com.java.mall.controller.PFController">
<propertyname="userService"ref="userService"></property>
<propertyname="userGroupService"ref="userGroupServiceProxy"></property>
</bean>

同時需要在實體類中注入依賴,提供setter方法,

;
publicvoidsetuserGroupService(){
this.userGroupService=userGroupService;

Ⅳ 2022-03-12 SpringBoot 使用redis做緩存,設置失效時間以及序列化

SpringBoot的cache緩存,是針對返回值的一種操作
springboot使用redis做緩存時,默認只需要導入redis依賴,即可實現使用redis做緩存

不需要導入cache依賴
在啟動類上加上 @EnableCaching 即可開啟緩存功能
關於各個註解的使用,這里不再細說,網上詳細的教程很多,這里主要講一下如何指定過期時間

默認是永不過期,如果需要指定過期時間,則需要增加配置類