SpringBoot3.0集成Redis緩存的實現(xiàn)示例
一、什么是redis緩存
Redis緩存是一個開源的使用ANSIC語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。它主要用于作為數(shù)據(jù)庫、緩存和消息中間件,以快速讀寫和豐富的數(shù)據(jù)結(jié)構(gòu)支持而著稱。
在應(yīng)用程序和數(shù)據(jù)庫之間,Redis緩存作為一個中間層起著關(guān)鍵作用。通過將常用的數(shù)據(jù)存儲在Redis內(nèi)存中,可以快速讀取,從而避免了從數(shù)據(jù)庫進(jìn)行復(fù)雜的查詢操作,減輕了數(shù)據(jù)庫服務(wù)器的壓力,并提高了應(yīng)用程序的性能和響應(yīng)速度。
此外,為了優(yōu)化熱門查詢的性能,可以確定希望緩存的查詢結(jié)果,特別是最常用和最耗時的查詢。這樣可以進(jìn)一步提高應(yīng)用程序的性能和吞吐量。
spring-boot-starter-data-redis默認(rèn)的Redis客戶端是Lettuce。這是因為Lettuce是一個線程安全的、基于Netty通信的Redis客戶端,相比之下,Jedis在多線程環(huán)境下存在線程安全問題,因此需要增加連接池來解決線程安全的問題,同時可以限制redis客戶端的數(shù)量。
而Lettuce在多線程環(huán)境下不存在線程安全問題,一個連接實例就可以滿足多線程環(huán)境下的并發(fā)訪問,當(dāng)然實例不夠的情況下也可以按需增加實例,保證伸縮性。因此,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來序列化和反序列化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)用提供緩存支持,簡化和自動化緩存的配置和識別。通過使用 Spring Cache 的抽象層,開發(fā)者可以輕松地使用各種緩存解決方案。
Spring Boot Starter Cache 集成了各種主流緩存實現(xiàn)(ConcurrentMap、redis、ehcache、Caffeine等)
Spring Boot Starter Cache 默認(rèn)使用ConcurrentMap作為緩存;如果工程中引入了redis配置,則會使用redis作為緩存
Spring Boot Starter Cache 通過CacheManager判斷具體使用哪個緩存,每個緩存都有一個具體的CacheManager(比如:EhCacheCacheManager,RedisCacheManager,CaffeineCacheManager),如果沒有配置任何的CacheManager,則會使用ConcurrentMap作為緩存
常用注解說明:
| 名稱 | 說明 |
|---|---|
| @EnableCaching | 開啟基于注解的緩存 |
| @CacheConfig | 統(tǒng)一配置本類的緩存注解的屬性 |
| @Cacheable | 常用于查詢方法,能夠根據(jù)方法的請求參數(shù)對其進(jìn)行緩存 |
| @CachePut | 常用于更新/保存方法,會將方法返回值放入緩存 |
| @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)建一個配置類并實現(xiàn)CacheManagerCustomizer接口來自定義緩存配置?;蛘撸憧梢允褂?nbsp;@EnableCaching注解并使用屬性來定義緩存配置。CacheManagerCustomizer是一個Spring框架的接口,它允許用戶自定義擴(kuò)展CacheManager。當(dāng)需要對某個CacheManager實現(xiàn)進(jìn)行一些自定義時,可以實現(xiàn)CacheManagerCustomizer接口,指定泛型為需要進(jìn)行自定義的CacheManager實現(xiàn)類,然后把它定義為一個Spring bean。通過實現(xiàn)這個接口,你可以對Spring的CacheManager進(jìn)行自定義擴(kuò)展,例如配置緩存策略、設(shè)置緩存過期時間等。
這個接口的使用可以幫助開發(fā)者更好地控制和優(yōu)化緩存的行為,提高應(yīng)用程序的性能和響應(yīng)速度。在實現(xiàn)自定義擴(kuò)展時,可以使用Spring的注解或XML配置來定義自定義邏輯,并根據(jù)需要選擇是否將自定義的邏輯應(yīng)用到所有CacheManager實現(xiàn)上,或者只應(yīng)用到特定的CacheManager實現(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)用時,它們將與 Redis 緩存進(jìn)行交互。 - 自定義序列化:
如果你需要自定義序列化,你可以創(chuàng)建一個配置類并實現(xiàn)RedisSerializer接口。然后,你可以在 Redis 的相關(guān)配置中指定這個序列化器。
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)建測試Service
@Service
public class MyService {
@Cacheable(value = "my_cache") //將方法結(jié)果緩存到"my_cache"中,key為方法參數(shù)的哈希值
public String getSomeData(String id) throws InterruptedException {
// 模擬一個耗時操作,比如從數(shù)據(jù)庫中獲取數(shù)據(jù)
Thread.sleep(1000); //休眠1秒,模擬耗時操作
return "data for " + id;
}
}
2、創(chuàng)建測試類
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í)行耗時,后面兩次直接從緩存讀取,幾乎沒有耗時
參考
到此這篇關(guān)于SpringBoot3.0集成Redis緩存的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot集成Redis緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合Redis實現(xiàn)token緩存
- SpringBoot結(jié)合Redis實現(xiàn)緩存管理功能
- SpringBoot整合redis使用緩存注解詳解
- SpringBoot+MyBatis+Redis實現(xiàn)分布式緩存
- springboot使用redis注解做緩存的基本操作方式
- SpringBoot中Redis的緩存更新策略詳解
- springboot整合ehcache和redis實現(xiàn)多級緩存實戰(zhàn)案例
- SpringBoot結(jié)合Redis實現(xiàn)緩存
- SpringBoot使用Redis實現(xiàn)分布式緩存
- SpringBoot中的Redis?緩存問題及操作方法
相關(guān)文章
Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue
這篇文章主要介紹了Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue,本文通過實例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下2016-12-12
Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解
這篇文章主要給大家介紹了關(guān)于Swift中defer關(guān)鍵字推遲執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包
Swift引進(jìn)了閉包的概念,這個與object-c的block類似,使用過block的話都知道有多方便,所以開始學(xué)Swift,先要把閉包學(xué)會,后面使用會很頻繁。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體
最近在學(xué)swift 3.0,主要看的是蘋果的官方文檔,這里只是根據(jù)自己看官方文檔的理解所做的一些記錄,不是完整的翻譯,希望也對你有所幫助。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03

