一、什么是redis緩存
Redis緩存是一個(gè)開(kāi)源的使用ANSIC語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。它主要用于作為數(shù)據(jù)庫(kù)、緩存和消息中間件,以快速讀寫(xiě)和豐富的數(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)化熱門(mén)查詢的性能,可以確定希望緩存的查詢結(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 的抽象層,開(kāi)發(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 |
開(kāi)啟基于注解的緩存 |
@CacheConfig |
統(tǒng)一配置本類(lèi)的緩存注解的屬性 |
@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 主類(lèi)或配置類(lèi)上添加@EnableCaching
注解以啟用緩存支持。 -
定義緩存配置:
你可以創(chuàng)建一個(gè)配置類(lèi)并實(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)類(lèi),然后把它定義為一個(gè)Spring bean。通過(guò)實(shí)現(xiàn)這個(gè)接口,你可以對(duì)Spring的CacheManager進(jìn)行自定義擴(kuò)展,例如配置緩存策略、設(shè)置緩存過(guò)期時(shí)間等。
這個(gè)接口的使用可以幫助開(kāi)發(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ù)類(lèi)中的方法上使用 Spring 的緩存注解,例如@Cacheable
,@CacheEvict
,@CachePut
等。這樣,當(dāng)這些方法被調(diào)用時(shí),它們將與 Redis 緩存進(jìn)行交互。 -
自定義序列化:
如果你需要自定義序列化,你可以創(chuàng)建一個(gè)配置類(lèi)并實(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è)試類(lèi)
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é)果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-833476.html
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
可以看見(jiàn),只有第一次執(zhí)行耗時(shí),后面兩次直接從緩存讀取,幾乎沒(méi)有耗時(shí)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-833476.html
參考
- spring-boot-starter-cache
- spring-boot-starter-redis
到了這里,關(guān)于【SpringBoot3】Spring Boot 3.0 集成 Redis 緩存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!