最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年03月03日 15:41:45   作者:頑石九變  
緩存就是一個存儲器,常用 Redis作為緩存數(shù)據(jù)庫,本文主要介紹了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)(ConcurrentMapredis、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)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 解決 Xcode 6-Beta2 智能提示bug

    解決 Xcode 6-Beta2 智能提示bug

    最近開始學(xué)習(xí) Swift ,因為感覺這個真是個不錯的東西,有很多新的特性,雖然 Titanium 之后也必定會支持,但總有不少東西要使用原生開發(fā)才可以實現(xiàn),所以就乘這個新語言出來之際開始學(xué)習(xí)啦!
    2014-07-07
  • 詳解Swift編程中下標(biāo)的用法

    詳解Swift編程中下標(biāo)的用法

    這篇文章主要介紹了Swift編程中下標(biāo)的用法,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Swift和C語言混合編程教程

    Swift和C語言混合編程教程

    這篇文章主要介紹了Swift和C語言混合編程教程,介紹基本數(shù)據(jù)類型對比、指針、常量等內(nèi)容,需要的朋友可以參考下
    2014-07-07
  • Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue

    Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue

    這篇文章主要介紹了Swift中循環(huán)語句中的轉(zhuǎn)移語句 break 和 continue,本文通過實例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下
    2016-12-12
  • 升級到Swift 4.0可能遇到的坑總結(jié)

    升級到Swift 4.0可能遇到的坑總結(jié)

    這篇文章主要給大家介紹了關(guān)于升級到Swift 4.0可能遇到的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用swift4具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Swift中defer關(guān)鍵字推遲執(zhí)行示例詳解

    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使用SDPhotoBriwser瀏覽圖片教程

    swift使用SDPhotoBriwser瀏覽圖片教程

    這篇文章主要為大家介紹了swift如何使用SDPhotoBriwser瀏覽圖片的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • swift實現(xiàn)隨機(jī)背景色

    swift實現(xiàn)隨機(jī)背景色

    這篇文章主要為大家詳細(xì)介紹了swift實現(xiàn)隨機(jī)背景色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包

    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)體

    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

最新評論

黄龙县| 大名县| 台江县| 丹寨县| 富宁县| 化隆| 嘉义县| 萍乡市| 潮州市| 剑阁县| 福建省| 烟台市| 景东| 承德市| 鲁甸县| 云林县| 梅州市| 满洲里市| 丹棱县| 依兰县| 三门县| 长宁区| 莲花县| 葫芦岛市| 定结县| 侯马市| 长宁县| 江津市| 阆中市| 庆安县| 咸宁市| 贵德县| 扎赉特旗| 逊克县| 包头市| 奉贤区| 银川市| 宁陵县| 水城县| 五寨县| 武定县|