SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例
一、什么是redis緩存
Redis緩存是一個(gè)開源的使用ANSIC語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。它主要用于作為數(shù)據(jù)庫(kù)、緩存和消息中間件,以快速讀寫和豐富的數(shù)據(jù)結(jié)構(gòu)支持而著稱。
在應(yīng)用程序和數(shù)據(jù)庫(kù)之間,Redis緩存作為一個(gè)中間層起著關(guān)鍵作用。通過(guò)將常用的數(shù)據(jù)存儲(chǔ)在Redis內(nèi)存中,可以快速讀取,從而避免了從數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜的查詢操作,減輕了數(shù)據(jù)庫(kù)服務(wù)器的壓力,并提高了應(yīng)用程序的性能和響應(yīng)速度。
此外,為了優(yōu)化熱門查詢的性能,可以確定希望緩存的查詢結(jié)果,特別是最常用和最耗時(shí)的查詢。這樣可以進(jìn)一步提高應(yīng)用程序的性能和吞吐量。
spring-boot-starter-data-redis默認(rèn)的Redis客戶端是Lettuce。這是因?yàn)長(zhǎng)ettuce是一個(gè)線程安全的、基于Netty通信的Redis客戶端,相比之下,Jedis在多線程環(huán)境下存在線程安全問(wèn)題,因此需要增加連接池來(lái)解決線程安全的問(wèn)題,同時(shí)可以限制redis客戶端的數(shù)量。
而Lettuce在多線程環(huán)境下不存在線程安全問(wèn)題,一個(gè)連接實(shí)例就可以滿足多線程環(huán)境下的并發(fā)訪問(wèn),當(dāng)然實(shí)例不夠的情況下也可以按需增加實(shí)例,保證伸縮性。因此,Spring Boot在后續(xù)版本中選擇了Lettuce作為默認(rèn)的Redis客戶端。
二、SpringBoot3 如何集成 Redis
1)添加依賴
在pom.xml文件中添加Spring Boot Starter Data Redis依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2)配置Redis連接
在application.properties或application.yml文件中配置Redis連接信息:
spring.data.redis.host=127.0.0.1 spring.data.redis.port=6379 spring.data.redis.database=0 spring.data.redis.password=
3)配置 RedisTemplate
Bean
@Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); // 使用Jackson2JsonRedisSerializer來(lái)序列化和反序列化redis的value值(默認(rèn)使用JDK的序列化方式) Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); template.setValueSerializer(serializer); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer); return template; } }
4)使用示例
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; @SpringBootTest public class RedisTemplateTest { @Autowired private RedisTemplate<String, Object> redisTemplate; @Test void test() { redisTemplate.opsForValue().set("key_name", "my name is Jacky"); System.out.println("緩存設(shè)置成功"); String value = (String) redisTemplate.opsForValue().get("key_name"); System.out.println(value); } }
三、spring-boot-starter-cache 結(jié)合 Redis 使用
1、什么是 spring-boot-starter-cache
Spring Boot Starter Cache 是 Spring Boot 體系內(nèi)提供使用 Spring Cache 的 Starter 包。它可以為你的 Spring Boot 應(yīng)用提供緩存支持,簡(jiǎn)化和自動(dòng)化緩存的配置和識(shí)別。通過(guò)使用 Spring Cache 的抽象層,開發(fā)者可以輕松地使用各種緩存解決方案。
Spring Boot Starter Cache 集成了各種主流緩存實(shí)現(xiàn)(ConcurrentMap
、redis
、ehcache
、Caffeine
等)
Spring Boot Starter Cache 默認(rèn)使用ConcurrentMap
作為緩存;如果工程中引入了redis
配置,則會(huì)使用redis
作為緩存
Spring Boot Starter Cache 通過(guò)CacheManager
判斷具體使用哪個(gè)緩存,每個(gè)緩存都有一個(gè)具體的CacheManager
(比如:EhCacheCacheManager
,RedisCacheManager
,CaffeineCacheManager
),如果沒(méi)有配置任何的CacheManager
,則會(huì)使用ConcurrentMap
作為緩存
常用注解說(shuō)明:
名稱 | 說(shuō)明 |
---|---|
@EnableCaching | 開啟基于注解的緩存 |
@CacheConfig | 統(tǒng)一配置本類的緩存注解的屬性 |
@Cacheable | 常用于查詢方法,能夠根據(jù)方法的請(qǐng)求參數(shù)對(duì)其進(jìn)行緩存 |
@CachePut | 常用于更新/保存方法,會(huì)將方法返回值放入緩存 |
@CacheEvict | 清空緩存 |
2、Redis 集成步驟
下面是如何在 Spring Boot 應(yīng)用中使用 spring-boot-starter-cache
與 Redis 進(jìn)行集成的步驟:
- 添加依賴:
在你的pom.xml
文件中添加spring-boot-starter-cache
和spring-boot-starter-data-redis
的依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置 Redis:
在application.properties
或application.yml
文件中配置 Redis 連接信息。啟用緩存支持:
在你的 Spring Boot 主類或配置類上添加@EnableCaching
注解以啟用緩存支持。定義緩存配置:
你可以創(chuàng)建一個(gè)配置類并實(shí)現(xiàn)CacheManagerCustomizer
接口來(lái)自定義緩存配置?;蛘?,你可以使用@EnableCaching
注解并使用屬性來(lái)定義緩存配置。CacheManagerCustomizer
是一個(gè)Spring框架的接口,它允許用戶自定義擴(kuò)展CacheManager。當(dāng)需要對(duì)某個(gè)CacheManager實(shí)現(xiàn)進(jìn)行一些自定義時(shí),可以實(shí)現(xiàn)CacheManagerCustomizer接口,指定泛型為需要進(jìn)行自定義的CacheManager實(shí)現(xiàn)類,然后把它定義為一個(gè)Spring bean。通過(guò)實(shí)現(xiàn)這個(gè)接口,你可以對(duì)Spring的CacheManager進(jìn)行自定義擴(kuò)展,例如配置緩存策略、設(shè)置緩存過(guò)期時(shí)間等。
這個(gè)接口的使用可以幫助開發(fā)者更好地控制和優(yōu)化緩存的行為,提高應(yīng)用程序的性能和響應(yīng)速度。在實(shí)現(xiàn)自定義擴(kuò)展時(shí),可以使用Spring的注解或XML配置來(lái)定義自定義邏輯,并根據(jù)需要選擇是否將自定義的邏輯應(yīng)用到所有CacheManager實(shí)現(xiàn)上,或者只應(yīng)用到特定的CacheManager實(shí)現(xiàn)上。
@Configuration public class CacheConfig { @Bean public CacheManagerCustomizer cacheManagerCustomizer() { return (cacheManager) -> { SimpleKeyGenerator keyGenerator = new SimpleKeyGenerator(); keyGenerator.setSalt("some_salt"); //設(shè)置鹽值,增強(qiáng)安全性 cacheManager.getCache("my_cache").setKeyGenerator(keyGenerator); //設(shè)置key生成策略 }; } }
- 使用緩存注解:
在你的服務(wù)類中的方法上使用 Spring 的緩存注解,例如@Cacheable
,@CacheEvict
,@CachePut
等。這樣,當(dāng)這些方法被調(diào)用時(shí),它們將與 Redis 緩存進(jìn)行交互。 - 自定義序列化:
如果你需要自定義序列化,你可以創(chuàng)建一個(gè)配置類并實(shí)現(xiàn)RedisSerializer
接口。然后,你可以在 Redis 的相關(guān)配置中指定這個(gè)序列化器。
private Jackson2JsonRedisSerializer<Object> jacksonSerializer() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, Visibility.ANY); objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); return new Jackson2JsonRedisSerializer<>(objectMapper,Object.class); }
3、使用示例
1、創(chuàng)建測(cè)試Service
@Service public class MyService { @Cacheable(value = "my_cache") //將方法結(jié)果緩存到"my_cache"中,key為方法參數(shù)的哈希值 public String getSomeData(String id) throws InterruptedException { // 模擬一個(gè)耗時(shí)操作,比如從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù) Thread.sleep(1000); //休眠1秒,模擬耗時(shí)操作 return "data for " + id; } }
2、創(chuàng)建測(cè)試類
import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.shi9.module.system.service.MyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.util.StopWatch; @Slf4j @SpringBootTest public class MyServiceTest { @Autowired private MyService myService; @Test public void getData() throws Exception { StopWatch stopWatch = new StopWatch("getData"); stopWatch.start("1"); System.out.println(myService.getSomeData("k")); stopWatch.stop(); stopWatch.start("2"); System.out.println(myService.getSomeData("k")); stopWatch.stop(); stopWatch.start("3"); System.out.println(myService.getSomeData("k")); stopWatch.stop(); System.out.println(stopWatch.prettyPrint()); } }
執(zhí)行結(jié)果如下:
data for k
data for k
data for k
StopWatch 'getData': 1.3141034 seconds
----------------------------------------
Seconds % Task name
----------------------------------------
1.3104986 100% 1
0.0029345 00% 2
0.0006703 00% 3
可以看見,只有第一次執(zhí)行耗時(shí),后面兩次直接從緩存讀取,幾乎沒(méi)有耗時(shí)
參考
到此這篇關(guān)于SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot集成Redis緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合Redis實(shí)現(xiàn)token緩存
- SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存管理功能
- SpringBoot整合redis使用緩存注解詳解
- SpringBoot+MyBatis+Redis實(shí)現(xiàn)分布式緩存
- springboot使用redis注解做緩存的基本操作方式
- SpringBoot中Redis的緩存更新策略詳解
- springboot整合ehcache和redis實(shí)現(xiàn)多級(jí)緩存實(shí)戰(zhàn)案例
- SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存
- SpringBoot使用Redis實(shí)現(xiàn)分布式緩存
- SpringBoot中的Redis?緩存問(wèn)題及操作方法
相關(guān)文章
Swift Access Control訪問(wèn)控制與斷言詳細(xì)介紹
這篇文章主要介紹了Swift Access Control訪問(wèn)控制與斷言,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09深入理解Swift中單例模式的替換及Swift 3.0單例模式的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于Swift中單例模式替換的相關(guān)資料,然后又跟大家分享了關(guān)于Swift3.0 單例模式實(shí)現(xiàn)的幾種方法-Dispatch_Once的內(nèi)容,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11swift指針及內(nèi)存管理內(nèi)存綁定實(shí)例詳解
這篇文章主要為大家介紹了swift指針及內(nèi)存管理內(nèi)存綁定實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Swift中實(shí)現(xiàn)點(diǎn)擊、雙擊、捏、旋轉(zhuǎn)、拖動(dòng)、劃動(dòng)、長(zhǎng)按手勢(shì)的類和方法介紹
這篇文章主要介紹了Swift中實(shí)現(xiàn)點(diǎn)擊、雙擊、捏、旋轉(zhuǎn)、拖動(dòng)、劃動(dòng)、長(zhǎng)按手勢(shì)的類和方法介紹,本文分別給出了各種手勢(shì)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01在 Swift 中測(cè)試 UIAlertController的方法
這篇文章主要介紹了在 Swift 中測(cè)試 UIAlertController的方法的,需要的朋友可以參考下2015-10-10使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程
這篇文章主要介紹了使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程,講到了iOS中提供的NSXMLParser和NSXMLParserDelegate兩個(gè)API的用法,需要的朋友可以參考下2016-04-04Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體
最近在學(xué)swift 3.0,主要看的是蘋果的官方文檔,這里只是根據(jù)自己看官方文檔的理解所做的一些記錄,不是完整的翻譯,希望也對(duì)你有所幫助。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-03-03