自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Boot 2.x基礎(chǔ):使用集中式緩存Redis

存儲(chǔ) 存儲(chǔ)軟件 Redis
我們介紹了兩種進(jìn)程內(nèi)緩存的用法,包括Spring Boot默認(rèn)使用的ConcurrentMap緩存以及緩存框架EhCache。

 我們介紹了兩種進(jìn)程內(nèi)緩存的用法,包括Spring Boot默認(rèn)使用的ConcurrentMap緩存以及緩存框架EhCache。雖然EhCache已經(jīng)能夠適用很多應(yīng)用場(chǎng)景,但是由于EhCache是進(jìn)程內(nèi)的緩存框架,在集群模式下時(shí),各應(yīng)用服務(wù)器之間的緩存都是獨(dú)立的,因此在不同服務(wù)器的進(jìn)程間會(huì)存在緩存不一致的情況。即使EhCache提供了集群環(huán)境下的緩存同步策略,但是同步依然是需要一定的時(shí)間,短暫的緩存不一致依然存在。

[[338584]]

在一些要求高一致性(任何數(shù)據(jù)變化都能及時(shí)的被查詢到)的系統(tǒng)和應(yīng)用中,就不能再使用EhCache來解決了,這個(gè)時(shí)候使用集中式緩存就可以很好的解決緩存數(shù)據(jù)的一致性問題。接下來我們就來學(xué)習(xí)一下,如何在Spring Boot的緩存支持中使用Redis實(shí)現(xiàn)數(shù)據(jù)緩存。

動(dòng)手試試

本篇的實(shí)現(xiàn)將基于上一篇的基礎(chǔ)工程來進(jìn)行。先來回顧下上一篇中的程序要素:

User實(shí)體的定義

  1. @Entity 
  2. @Data 
  3. @NoArgsConstructor 
  4. public class User implements Serializable { 
  5.  
  6.     @Id 
  7.     @GeneratedValue 
  8.     private Long id; 
  9.  
  10.     private String name
  11.     private Integer age; 
  12.  
  13.     public User(String nameInteger age) { 
  14.         this.name = name
  15.         this.age = age; 
  16.     } 

User實(shí)體的數(shù)據(jù)訪問實(shí)現(xiàn)(涵蓋了緩存注解)

  1. @CacheConfig(cacheNames = "users"
  2. public interface UserRepository extends JpaRepository<User, Long> { 
  3.  
  4.     @Cacheable 
  5.     User findByName(String name); 
  6.  

下面開始改造這個(gè)項(xiàng)目:

第一步:pom.xml中增加相關(guān)依賴:

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-data-redis</artifactId> 
  4. </dependency> 
  5.  
  6. <dependency> 
  7.     <groupId>org.apache.commons</groupId> 
  8.     <artifactId>commons-pool2</artifactId> 
  9. </dependency> 

在Spring Boot 1.x的早期版本中,該依賴的名稱為spring-boot-starter-redis,所以在Spring Boot 1.x基礎(chǔ)教程中與這里不同。

第二步:配置文件中增加配置信息,以本地運(yùn)行為例,比如:

  1. spring.redis.host=localhost 
  2. spring.redis.port=6379 
  3. spring.redis.lettuce.pool.max-idle=8 
  4. spring.redis.lettuce.pool.max-active=8 
  5. spring.redis.lettuce.pool.max-wait=-1ms 
  6. spring.redis.lettuce.pool.min-idle=0 
  7. spring.redis.lettuce.shutdown-timeout=100ms 

關(guān)于連接池的配置,注意幾點(diǎn):

Redis的連接池配置在1.x版本中前綴為spring.redis.pool與Spring Boot 2.x有所不同。

在1.x版本中采用jedis作為連接池,而在2.x版本中采用了lettuce作為連接池

以上配置均為默認(rèn)值,實(shí)際上生產(chǎn)需進(jìn)一步根據(jù)部署情況與業(yè)務(wù)要求做適當(dāng)修改.

再來試試單元測(cè)試:

  1. @Slf4j 
  2. @RunWith(SpringRunner.class) 
  3. @SpringBootTest 
  4. public class Chapter54ApplicationTests { 
  5.  
  6.     @Autowired 
  7.     private UserRepository userRepository; 
  8.  
  9.     @Autowired 
  10.     private CacheManager cacheManager; 
  11.  
  12.     @Test 
  13.     public void test() throws Exception { 
  14.         System.out.println("CacheManager type : " + cacheManager.getClass()); 
  15.  
  16.         // 創(chuàng)建1條記錄 
  17.         userRepository.save(new User("AAA", 10)); 
  18.  
  19.         User u1 = userRepository.findByName("AAA"); 
  20.         System.out.println("第一次查詢:" + u1.getAge()); 
  21.  
  22.         User u2 = userRepository.findByName("AAA"); 
  23.         System.out.println("第二次查詢:" + u2.getAge()); 
  24.     } 
  25.  

執(zhí)行測(cè)試輸出可以得到:

  1. CacheManager type : class org.springframework.data.redis.cache.RedisCacheManager 
  2. Hibernate: select next_val as id_val from hibernate_sequence for update 
  3. Hibernate: update hibernate_sequence set next_val= ? where next_val=? 
  4. Hibernate: insert into user (age, name, id) values (?, ?, ?) 
  5. 2020-08-12 16:25:26.954  INFO 68282 --- [           main] io.lettuce.core.EpollProvider            : Starting without optional epoll library 
  6. 2020-08-12 16:25:26.955  INFO 68282 --- [           main] io.lettuce.core.KqueueProvider           : Starting without optional kqueue library 
  7. Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=? 
  8. 第一次查詢:10 
  9. 第二次查詢:10 

可以看到:

第一行輸出的CacheManager type為org.springframework.data.redis.cache.RedisCacheManager,而不是上一篇中的EhCacheCacheManager了

第二次查詢的時(shí)候,沒有輸出SQL語句,所以是走的緩存獲取

整合成功!

思考題

既然EhCache等進(jìn)程內(nèi)緩存有一致性問題存在,而Redis性能好而且還能解決一致性問題,那么我們只要學(xué)會(huì)用Redis就好了咯,為什么還要學(xué)進(jìn)程內(nèi)緩存呢?先留下你的思考,下一篇我們一起討論這個(gè)問題!歡迎關(guān)注本系列教程:《Spring Boot 2.x基礎(chǔ)教程》

代碼示例

本文的相關(guān)例子可以查看下面?zhèn)}庫中的chapter5-4目錄:

Github:https://github.com/dyc87112/SpringBoot-Learning/

Gitee:https://gitee.com/didispace/SpringBoot-Learning/

【本文為51CTO專欄作者“翟永超”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過51CTO聯(lián)系作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2012-02-23 23:33:37

開源memcached

2021-03-04 10:11:50

MongoDBSpring BootSpring Boot

2022-03-18 09:00:00

開發(fā)Web服務(wù)應(yīng)用程序

2023-08-22 14:20:21

2021-02-03 10:49:34

JTA分布式事務(wù)

2019-11-07 11:21:21

安全軟件IT

2022-03-29 14:28:03

架構(gòu)安全設(shè)計(jì)

2012-02-21 09:59:52

2025-03-27 07:30:28

2025-04-21 07:31:21

OB單機(jī)版數(shù)據(jù)庫

2009-07-02 19:24:50

安全管理Windows審計(jì)

2025-04-08 07:30:40

數(shù)據(jù)庫對(duì)象索引

2015-07-28 09:44:38

集中式云數(shù)據(jù)加密安全漏洞

2009-07-20 11:11:34

分光器FTTP

2011-10-19 13:53:11

2025-02-18 07:30:35

2022-06-29 10:19:57

VMware

2021-12-31 08:48:23

Logback日志管理

2017-06-27 10:21:12

vRealize LoNSX日志管理

2014-08-05 09:15:14

SDN
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)