1. SpringBoot緩存(Ehcache)
(3)如果我們想要自定 Ehcache 配置文件的名稱和位置,可以在 application.properties 中添加如下配置:
執行結果下如下:
可以看到第一次從DB查詢了數據,第二次則從緩存讀取,當更新DB數據時同時也更新了緩存數據,再次取數據仍然走緩存。
對於高頻數據,一般希望長時間緩存,對於臨時數據,如驗證碼,token等,一般需要一個指定的時間,到期則取消。
可以通過一個類去控制緩存的有效時間,一般指定 timeToIdleSeconds=0 表示數據一直有效, timeToLiveSeconds=X秒 指定過期時間,如下:
然後在controller靈活的調用
對於無狀態的系統,可以方便的緩存token,驗證碼等短時有效的數據,方便存取。
2. springboot開啟Cache緩存
一、Cache介面下Spring提供了各種xxxCache的實現;如RedisCache,EhCacheCache ,ConcurrentMapCache等;
每次調用需要緩存功能的方法時,Spring會檢查檢查指定參數的指定的目標方法是否已經被調用過;如果有就直接從緩存中獲取方法調用後的結果,如果沒有就調用方法並緩存結碼帶果後返回給用戶。下次調用直接從緩存中獲取。
使用Spring緩存抽象時我們需要關注以下兩點;
1、確定方法需要被緩存以及他們的緩存策略
2、從緩存模襪中讀取之前緩存存儲的數據
二、注意:
1.當我們要使用root對象的屬性作為key時我們也可以將「#root」省略,遲碼蘆因為Spring默認使用的就是root對象的屬性。 如
@Cacheable(key = "targetClass + methodName +#p0")
2.使用方法參數時我們可以直接使用「#參數名」或者「#p參數index」。 如:
@Cacheable(value="users", key="#id")
@Cacheable(value="users", key="#p0")
三、使用
1.依賴
2.啟動類註解@EnableCaching開啟緩存
3.緩存@Cacheable
@Cacheable註解會先查詢是否已經有緩存,有會使用緩存,沒有則會執行方法並緩存。
參考 https://www.cnblogs.com/yueshutong/p/9381540.html
3. SpringBoot整合SpringSeesion實現Redis緩存
使用Spring Boot開發項目時我們經常需要存儲Session,因為Session中會存一些用戶信息或者登錄信息。傳統的web服務是將session存儲在內存中的,一旦服務掛了,session也就消失了,這時候我們就需要將session存儲起來,而Redis就是用來緩存seesion的一種非關系型資料庫,我們可以通過配置或者註解的方式將Spring Boot和Redis整合。而在分布式系統中又會涉及到session共享的問題,多個服務同時部署時session需要共享,Spring Session可以幫助我們實現這一功能。將Spring Session集成到Spring Boot框架中並使用Redis進行緩存是目前非常流行的解決方案,接下來就跟著我一起學習吧。
工具/材料
IntelliJ IDEA
首先我們創建一個Spring Boot 2.x的項目,在application.properties配置文件中添加Redis的配置,Spring和Redis的整合可以參考我其他的文章,此處不再詳解。我們設置服務埠server.port為8080埠用於啟動第一個服務。
接下來我們需要在pom文件中添加spring-boot-starter-data-redis和spring-session-data-redis這兩個依賴,spring-boot-starter-data-redis用於整合Spring Boot和Redis,spring-session-data-redis集成了spring-session和spring-data-redis,提供了session與redis的整合方案。
接下來我們創建一個配置類RedisSessionConfig,這個類使用@Configuration註解表明這是一個配置類。在這個類上我們同時添加註解@EnableRedisHttpSession,表示開啟Redis的Session管理。如果需要設置失效時間可以使用@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)表示一小時後失效。若同時需要設置Redis的命名空間則使用@EnableRedisHttpSession(maxInactiveIntervalInSeconds=3600, redisNamespace="{spring.session.redis.namespace}") ,其中{spring.session.redis.namespace}表示從配置文件中讀取這個命名空間。
配置完成後我們寫一個測試類SessionController,在這個類中我們寫兩個方法,一個方法用於往session中存數據,一個用於從session中取數據,代碼如下圖所示,我們存取請求的url。啟動類非常簡單,一般都是通用的,我們創建一個名為SpringbootApplication的啟動類,使用main方法啟動。
接下來我們使用Postman分別請求上面兩個介面,先請求存數據介面,再請求取數據介面,結果如下圖所示,我們可以看到數據已從redis中取出。另外需要注意sessionId的值,這是session共享的關鍵。
為了驗證兩個服務是否共享了session,我們修改項目的配置文件,將服務埠server.port改為8090,然後再啟動服務。此時我們不必在請求存數據的介面,只需要修改請求埠號再一次請求取數據的介面即可。由下圖可以看到兩次請求的sessionId值相同,實現了session的共享。
以上我們完成了SpringBoot整合SpringSeesion實現Redis緩存的功能,在此我們還要推薦一個Redis的可視化工具RedisDesktopManager,我們可以配置Redis資料庫的連接,然後便可以非常直觀地查看到存儲到Redis中的session了,如下圖所示,session的命名空間是share,正是從配置文件中讀取到的。
特別提示
如果Redis伺服器是很多項目共用的,非常建議配置命名空間,否則同時打開多個項目的瀏覽器頁面可能會導致session錯亂的現象。
4. Spring boot + Mybatis plus + Redis實現二級緩存
1.1 通過application.yml配置redis的連接信息,springboot默認redis用的lecttuce客戶端,如果想用jedis的話,只需要在pom.xml中引入redis的時候排除在lecttuce,然後再導入jedis的jar包就好了,
1.2 打開mybatis plus的二級緩存,為true的時候是開啟的,false是關閉二級緩存
1.3 編寫緩存類繼承Cache類,實現Cache中的方法
1.4 早*.xml中加上<cache>標簽,type寫你所編寫二級緩存類的路徑
5. 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
6. Spring Boot Cache - 本地緩存
pom.xml
使用Spring Boot Cache框架,其中一個很大的好處,就是可以很猜改方便的枝返更換緩存實現
Spring Boot會檢查class path里的類,發現合適的(比如caffeine)就會生成對應猛兆飢的 CacheManager
application.properties
7. 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]]
8. SpringBoot進階之整合Shiro實現緩存和會話管理
大家好,一直以來我都本著用最通俗的話理解核心的知識點, 我認為所有的難點都離不開 「基礎知識」 的鋪墊。目前正在出一個 SpringBoot 長期系列教程,從入門到進階, 篇幅會較多~
「大佬可以繞過 ~」
如果你是一路看過來的,很高興你能夠耐心看完。之前帶大家學了 Springboot 基礎部分,對基本的使用有了初步的認識, 接下來的幾期內容將會帶大家進階使用,會先講解基礎 中間件 的使用和一些場景的應用,或許這些技術你聽說過,沒看過也沒關系,我會帶大家一步一步的入門,耐心看完你一定會有 收獲 ~
上期帶大家學習了 Shiro 中如何進行許可權認證,本期將帶大家學習 Shiro 中如何進行 緩存和會話管理 ,最後我們將做一個在線用戶管理以及強制下線用戶的功能,同樣的,我們集成到 Springboot 中。
首先我們要明白使用緩存的原因,為啥要用它 還記得之前帶大家實現的 用戶認證 和 許可權認證 嗎,那裡我使用了 MockUser ,真實場景中是要去數據查詢的,這樣一來就會產生耗時,請求多的時候資料庫肯定忙不過來了,所以我們需要使用緩存來提高程序響應速度
緩存使用 Redis ,下面就帶大家整一下:
修改 ShiroConfig ,添加方法
這樣就可以了,大家可以把測試獲取用戶的地方改成資料庫獲取,看下 控制台 sql日誌會明顯減少,因為有一部分是從緩存拿的
這部分功能還是比較好玩的,學完可以自由發揮做一個房間功能,可以加入可以踢人,下面我們就開整
修改 ShiroConfig ,添加方法,因為我們使用的是 Redis 緩存
實現 SessionListener
最後同樣的,想要開啟需要我們注入到 Manager 中:
我們先定義一個類,用來記錄在線用戶:
那麼怎麼獲取呢?我們定義一個方法,大家實踐中可以抽到 Service 層,這里方便演示,我直接寫到控制器里
如果你看誰不爽,可以直接讓他下線,hhh~
是不是很簡單,這里就不演示了,大家自行試試
本期內容就到這里結束了,總結一下,本節主要講了 Shiro 如何進行緩存以及如何進行用戶會話管理,大家可以舉一反三,做一些小功能嘗試嘗試
下期給大家講講 Shiro 中如何整合 JWT ,這個大家應該不陌生,如果不知道啥是 JWT 也沒關系,我會帶大家一步一步入門,下期也是 Shiro 系列的終極篇,內容可能有點多,耐心看完哦。歡迎加群一起學習交流 ~
9. SpringBoot 操作 Redis的各種實現(Jedis、Redisson的區別比較)
共同點:都提供了基於Redis操作的Java API,只是封裝程度,具體實現稍有不同。
不同點:
是Redis的Java實現的客戶端。支汪模持基本的數據類型如:String、Hash、List、Set、Sorted Set。
特點:使用阻塞的I/O,方法調用同步,程序流需要等到socket處理完I/O才能執行,不支持非同步操作。Jedis客戶端實例不是線程安全的,需要通過連接池來使用Jedis。
優點點:分布式鎖,分布式集合,可通過Redis支持延遲隊列。
用於線程安全同步,非同步和響應使用,支持集群,Sentinel,管道和編碼器。
基於Netty框架的事件驅動的通信層,其方法調用是非同步的。Lettuce的API是線程安全的,所以可以操作單個Lettuce連接來完成各種操作。
maven配置引入,(要加上版本號,我這里是因為Parent已聲明)
application-dev.yml
redisson-config.yml
或者,配置 redisson-config.json
新建讀取配置類銀禪
或者,在 application.yml中配置如下
4.3.1 豐富的jar支持,尤其是對 Netty NIO框架
4.3.2 豐富的配置機制選擇,這里是詳細的配置說明
關於序列化機制中,就有很多
4.3.3 API支持(部分展示困搏緩),具體的 Redis --> RedissonClient ,可查看這里
4.3.4 輕便的豐富的鎖機制的實現
參考 RedisTemplate 配置。
另外,還需要額外的配置類
基於spring緩存實現
10. 2022-03-12 SpringBoot 使用redis做緩存,設置失效時間以及序列化
SpringBoot的cache緩存,是針對返回值的一種操作
springboot使用redis做緩存時,默認只需要導入redis依賴,即可實現使用redis做緩存
不需要導入cache依賴
在啟動類上加上 @EnableCaching 即可開啟緩存功能
關於各個註解的使用,這里不再細說,網上詳細的教程很多,這里主要講一下如何指定過期時間
默認是永不過期,如果需要指定過期時間,則需要增加配置類