㈠ SpringBoot進階之緩存中間件Redis
大家好,一直以來我都本著 用最通俗的話理解核心的知識點, 我認為所有的難點都離不開 「基礎知識」 的鋪墊
「大佬可以繞過 ~」
本節給大家講講 「Java的SpringBoot框架」 , 之前我們學習的都是java的基礎知識和底層提供的一些能力,我們日常工作都是在寫介面。在我們在產品開發中,一般我們都會選擇比較穩定的框架來幫我們加速開發,不會自己去造輪子,而在java眾多框架中,spring框架表現的非常好,大部分公司都會首選它作為開發框架,而至今,大部分企業都是以 springboot 來構建項目了,一個穩健的系統需要引入穩定的技術~
如果你是一路看過來的,很高興你能夠耐心看完。前幾期都是帶大家學習了 SpringBoot 的基礎使用以及集成 mybatis 開發,這也是我們寫業務的基礎,如果你還不熟悉這些,請先看完它們。接下來的幾期內容將會帶大家進階使用,會先講解基礎 中間件 的使用和一些場景的應用,或許這些技術你聽說過,沒看過也沒關系,我會帶大家一步一步的入門,耐心看完你一定會有 收獲 ,本期將會給大家講解最熱門的緩存中間件技術 Redis ,同樣的,我們集成到 Springboot 中。最近github可能會被牆,所以我把源碼放到了國內gitee上,本節我們依然使用上期的代碼
Redis 是由義大利人Salvatore Sanfilippo(網名:antirez)開發的一款內存高速緩存資料庫。全稱叫 Remote Dictionary Server(遠程數據服務) 是由 C語言 編寫的,Redis是一個 key-value 存儲系統,它支持豐富的數據類型,如: string、list、set、zset(sorted set)、hash 。
它本質上是一種鍵值對資料庫,我們之前學習的 mysql 它是持久層的關系型資料庫,而 redis 它的存儲主要存在 內存 中。我們都知道在 內存 中的數據讀取是非常快的,就好比你把一個變數存到磁碟讀取和直接放到代碼中運行,肯定是在代碼中拿到的速度快,因為運行時期,都是直接存到內存的。
給大家總結一下:
有了基本的概念之後,我們下面進行環境搭建,在學習階段,安裝 redis 很簡單,生產環境一般我們也會選擇雲產品,一切為了服務保障,雖說它只是做緩存用,但也是系統的一把 保護傘
如果你是 mac 用戶,你可以運行如下命令:
安裝完成後會提示你運行命令,運行即可。
win 用戶也很簡單,直接下載 redis 軟體,雙擊運行即可,運行之後它會有一個小方塊的圖案,和 locahost:6379 的log,說明運行成功了。初始階段沒有配置的 redis 默認 host 就是本地, port 就是 6379 , 而且是 沒有密碼 就可以訪問的。
推薦一個客戶端軟體 Redis Desktop Manager ,它是 redis 的客戶端界面軟體,方便麵我們學習的時候 清理緩存 使用,生產慎連。
我們不給大家講它的基本命令使用,它也有語法,可以通過類似命令執行,如果想學習的小夥伴,可以自行搜索。本期重點內容是在 sprinboot 中的使用,我們平時開發不可能是去命令行里敲的,都是代碼里執行,而目前市面上有很多封裝好的庫,我們可以直接調用它的方法,很方便的就可以操作它了,不用記一些繁瑣的命令,下面我們就實際操作一下:
修改 pom.xml
修改 application.yml :
redis 默認是有 16 個庫,不是 15 個啊,從 0 開始算的,我們隨便連一個
通過代碼很好理解, 首先需要引入 StringRedisTemplate ,然後需要設置一個 key ,那麼思考一下,這個 key 允許重復嗎
我們進客戶端看一下,發現 key 還是只有一個,但是值變成了新的值了,所以可以得知 key 是唯一的,我們重新設置的時候相當於刷新了它。
在 redis 中刪除緩存有兩種方式,一種是自我消亡,也就是 過期 銷毀,還有有一種是 主動 銷毀,我們先看一下,過期時間如何設置
我們設置了 10s 後過期,過完10s後發現,這個```key data``消失了。我們在看看如何主動刪除
我們可以利用 Redis 做一個計數器,實現自增功能,你可以用它做網站訪問統計
通常做法,我們會把它封裝一下,後續使用直接引入封裝好的即可,把它直接交給 Springboot容器 管理
其實這個類,你還可以繼續進一步封裝,比如約束 key 的規范,約束過期時間,約束數據類型等等,這一切也都是為了規范和後期維護,防止濫用緩存
緩存的主要場景是用於解決熱點數據問題,因為這些數據是訪問頻率比較高的,當大量的請求進來, mysql 可能壓力很大,這樣一來,數據查詢效率就很慢,用戶肯不高興等了,這樣用戶體驗很不好。所以我們一般做法,都是把這些熱點數據放到緩存里,因為緩存讀取速度很快。當有新數據的時候,我們再及時更新它,一般流程是先查詢緩存,查到了直接返回緩存數據,查不到再走資料庫,然後再刷回緩存。
但是並發足夠大的時候,還是會暴露出很多問題,比如面試常問的一些高頻問題 緩存雪崩、緩存穿透、緩存雪崩 ,這些問題後邊會給大家專門講,和如何去防範。所以總的來說,引入任何一門技術並不是萬事大吉,還需我們不斷的在實踐中積累經驗
本期到這里就結束了,總結一下,我們了解了什麼是 redis ,以及在 springboot 中如何去使用它們,很簡單,沒什麼復雜的東西。但這里想多說一點的是,緩存的設計卻是很復雜的,因為工具是死的,人是活的,我們如何正確設計,需要我們在項目中不斷的積累。
我們之前教大家查詢列表數據,都是所有數據返回,還沒有教大家如何去做分頁,下期將帶大家學習一下 mybatis 分頁插件的使用 ,下期不見不散, 關注我,不迷路~
㈡ SpringBoot集成Redis來實現緩存技術方案有哪些
首先可以在多台伺服器裝memcached,啟動時分別指定容量和埠 訪問時採用集群方式訪問,只需要spring配置文件裡面配置即可 value可以放任何對象,包括集合 每個鍵值的生命周期可以在放入時獨立設置 類庫可以用spymemcached 數據更新方式可以
㈢ 關於spring boot 緩存application.yml文件的配置
這些方式優先順序如下:命令行參數來自java:comp/env的JNDI屬性Java系統屬性(System.getProperties())操作系統環境變數RandomValuePropertySource配置的random.*屬性值jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件jar包外部的application.properties或application.yml(不帶spring.profile)配置文件jar包內部的application.properties或application.yml(不帶spring.profile)配置文件@Configuration註解類上的@PropertySource
㈣ springboot伺服器如何共享內存如何使用
注冊一個微服務。
1、准備三個服務,Eureka服務+提供RESTAPI的兩個簡單的微服務。
2、將微服務注冊到微服務中。
3、springboot不以任何方式限制這些應用程序的內存使用。此時springboot伺服器就能共享內存了。
㈤ springboot緩存怎麼來操作
1.在pom.xml中引入cache依賴,添加如下內容:
復制代碼
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
復制代碼
2.在Spring Boot主類中增加@EnableCaching註解開啟緩存功能,如下:
復制代碼
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
復制代碼
3.在數據訪問介面中,增加緩存配置註解,如:
復制代碼
@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {
@Cacheable
User findByName(String name);
}
復制代碼
SpringBoot支持很多種緩存方式:redis、guava、ehcahe、jcache等等。
㈥ 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寫你所編寫二級緩存類的路徑
㈦ spring boot + redis 實現session共享分析
HttpSession是由servelet容器進行管理的。而我們常用的應用容器有 Tomcat/Jetty等, 這些容器的HttpSession都是存放在對應的應用容器的內存中,在分布式集群的環境下,通常我們使用Nginx或者LVS、Zuul等進行反向代理和負載均衡,因此用戶請求是由一組提供相同服務的應用來進行處理,而用戶最終請求到的服務由Nginx和LVS、Zuul進行確定。
那麼問題就來了,我們怎樣保證多個相同的應用共享同一份session數據?對於這種問題Spring為我們提供了Spring Session進行管理我們的HttpSession。項目地址: http://projects.spring.io/spring-session/
1.添加Spring session的包,而Spring session 是將HttpSession存放在Redis中,因此需要添加Redis的包。我們這里是用了Spring boot進行配置Rdies。
2.使用@EnableRedisHttpSession註解進行配置啟用使用Spring session。
3.配置我們的Redis鏈接,我們這里使用的是Spring Boot作為基礎進行配置,因此我們只需要在YML或者Properties配置文件添加Redis的配置即可。
4.創建請求的控制器來進行確定我們是否啟用Session 共享。
5.將當前的工程拷貝一份.
通過上面請求顯示的結果我們可以看出使用的是同一個Seesion,我們也可以查看下存在Redis中的Session。我這里使用RDM進行查看,我們還可以查看Session的屬性。從圖可以看出我們存進入的url屬性。
我們從啟動Spring Session的配置註解@EnableRedisHttpSession開始。
1.我們可以通過@EnableRedisHttpSession可以知道,Spring Session是通過RedisHttpSessionConfiguration類進行配置的。
2.我們在RedisHttpSessionConfiguration類種的注釋可以知道,該類是用於創建一個過濾SessionRepositoryFilter。
3.探究下SessionRepositoryFilter類是在哪裡創建創建過程作用。
(1)哪裡創建:
通過搜索RedisHttpSessionConfiguration發現SessionRepositoryFilter的創建不是在RedisHttpSessionConfiguration,而是在父類中創建。
(2)SessionRepositoryFilter創建過程:
這里我們可以總結下:
Redis確保鏈接的情況下。
1.創建sessionRedisTemplate
2.創建
3.創建SessionRepositoryFilter
(3)SessionRepositoryFilter的作用:
SessionRepositoryFilter的主要作用接管Seession的管理。我們可以從下面幾個點知道為什麼?
4.我們研究下是怎樣接管Session?
(1)存儲Session的過程
當調用SessionRepositoryFilter.this.sessionRepository.save(session)完畢後,會判斷當前的SessionId是否與請求的中的Cookie中SessionId一致,若不一致的情況下會調用onNewSession()方法,我們可以通過配置類的可以看到使用的是
CookieHttpSessionStrategy();
從CookieHttpSessionStrategy.onNewSession()方法可以看到是將SessionId寫到Cookie中。
(2)獲取Session的過程
我們根據源碼的分析可以知道:
1.Spring Session 是通過SessionRepositoryFilter過濾器進行攔截,然後通過繼承HttpServletRequestWrapper進行管理Session。
2.Spring Session 為我們提供了3中存放的策略而每種策略提供對應的註解啟動。分別為:
(1)NoSql形式的MongoDb:@EnableMongoHttpSession
(2)持久化形式的JDBC:@EnableJdbcHttpSession
(3)緩存形式的Redis:@EnableRedisHttpSession
3.Spring Session 共享Session過程:
(1)先過程過濾器存儲將SessionID存放到本地的Cookie 和Redis中。
如果本地沒有啟用Cookie的情況下,Spring Session也就不能使用。
(2)獲取Session的時候,先從請求中獲取Session,Session不為空的情況下直接返回Session,若當前的Session為空的情況下,從Cookie中獲取SessionId,判斷SessionId不為空,再從Redis中獲取Session,若從Redis中獲取到的Session不為空將Session存放到請求中,再返回Session,如果從Redis中獲取的Session為空,再創建新的Session並且添加到請求中,後返回Session。
㈧ 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
㈨ 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錯亂的現象。
㈩ SpringBoot進階之整合Shiro實現緩存和會話管理
大家好,一直以來我都本著用最通俗的話理解核心的知識點, 我認為所有的難點都離不開 「基礎知識」 的鋪墊。目前正在出一個 SpringBoot 長期系列教程,從入門到進階, 篇幅會較多~
「大佬可以繞過 ~」
如果你是一路看過來的,很高興你能夠耐心看完。之前帶大家學了 Springboot 基礎部分,對基本的使用有了初步的認識, 接下來的幾期內容將會帶大家進階使用,會先講解基礎 中間件 的使用和一些場景的應用,或許這些技術你聽說過,沒看過也沒關系,我會帶大家一步一步的入門,耐心看完你一定會有 收獲 ~
上期帶大家學習了 Shiro 中如何進行許可權認證,本期將帶大家學習 Shiro 中如何進行 緩存和會話管理 ,最後我們將做一個在線用戶管理以及強制下線用戶的功能,同樣的,我們集成到 Springboot 中。
首先我們要明白使用緩存的原因,為啥要用它 還記得之前帶大家實現的 用戶認證 和 許可權認證 嗎,那裡我使用了 MockUser ,真實場景中是要去數據查詢的,這樣一來就會產生耗時,請求多的時候資料庫肯定忙不過來了,所以我們需要使用緩存來提高程序響應速度
緩存使用 Redis ,下面就帶大家整一下:
修改 ShiroConfig ,添加方法
這樣就可以了,大家可以把測試獲取用戶的地方改成資料庫獲取,看下 控制台 sql日誌會明顯減少,因為有一部分是從緩存拿的
這部分功能還是比較好玩的,學完可以自由發揮做一個房間功能,可以加入可以踢人,下面我們就開整
修改 ShiroConfig ,添加方法,因為我們使用的是 Redis 緩存
實現 SessionListener
最後同樣的,想要開啟需要我們注入到 Manager 中:
我們先定義一個類,用來記錄在線用戶:
那麼怎麼獲取呢?我們定義一個方法,大家實踐中可以抽到 Service 層,這里方便演示,我直接寫到控制器里
如果你看誰不爽,可以直接讓他下線,hhh~
是不是很簡單,這里就不演示了,大家自行試試
本期內容就到這里結束了,總結一下,本節主要講了 Shiro 如何進行緩存以及如何進行用戶會話管理,大家可以舉一反三,做一些小功能嘗試嘗試
下期給大家講講 Shiro 中如何整合 JWT ,這個大家應該不陌生,如果不知道啥是 JWT 也沒關系,我會帶大家一步一步入門,下期也是 Shiro 系列的終極篇,內容可能有點多,耐心看完哦。歡迎加群一起學習交流 ~