亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例

 更新時(shí)間:2024年03月03日 15:41:45   作者:頑石九變  
緩存就是一個(gè)存儲(chǔ)器,常用 Redis作為緩存數(shù)據(jù)庫(kù),本文主要介紹了SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下

一、什么是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,RedisCacheManagerCaffeineCacheManager),如果沒(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)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評(píng)論