欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot集成Redis及SpringCache緩存管理示例詳解

 更新時(shí)間:2024年09月28日 15:14:01   作者:高高要努力  
本文介紹了如何在SpringBoot中集成Redis并使用SpringCache進(jìn)行緩存管理,詳解了Redis的配置、使用以及SpringCache的注解,還闡述了SpringCache的工作原理,包括其AOP實(shí)現(xiàn)和與各種緩存框架的集成,使得開發(fā)者可以輕松實(shí)現(xiàn)緩存功能,以提高應(yīng)用性能

1.集成Redis

1.導(dǎo)入依賴

<!--spirngboot springdata對(duì)redis支持-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.配置信息

#數(shù)據(jù)源配置
spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
    jedis:
      pool:
        max-wait: 2000ms
        max-active: 8

3.注入redisTemplate使用

@RunWith(SpringRunner.class)  //使用springboot2.6.13的版本可以省略這個(gè)注解
@SpringBootTest(classes = App.class) //如果測(cè)試類和啟動(dòng)不在同一個(gè)包下classes必須要寫
public class SpringbootDataRedisApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void test() throws Exception{
        redisTemplate.opsForValue().set("name","zs");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }
}

4.自定義配置redis中key和value的序列化

@Configuration
public class RedisConfig {
    // 注入Redis連接工廠
    @Resource
    private RedisConnectionFactory factory;
    /**
     * @Description: 自定義RedisTemplate對(duì)象注入Bean容器中
     * @Author: Neuronet
     * @Date: 2023/10/22 18:49
     **/
    @Bean
    public RedisTemplate<Object, Object> redisTemplate() {
        // 1.創(chuàng)建一個(gè)RedisTemplate對(duì)象
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        // 2.指定Redis連接工廠
        redisTemplate.setConnectionFactory(factory);
        // 3.創(chuàng)建一個(gè)JSON格式序列化對(duì)象,此處使用的是Redis自己的的序列化器
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        // 4.指定除開hash數(shù)據(jù)類型之外的數(shù)據(jù)key和value使用什么序列化器
        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setValueSerializer(serializer);
        // 5.指定hash數(shù)據(jù)類型的key和value序列化器
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(serializer);
        return redisTemplate;
    }
} 

2.SpringCahe緩存管理

1. SpringCache概述

Spring 3.1 引入了激動(dòng)人心的基于注解(annotation)的緩存(cache)技術(shù),它本質(zhì)上不是一個(gè)具體的緩存實(shí)現(xiàn)方案(比如EHCache 或者 OSCache),而是一個(gè)對(duì)緩存使用的抽象,通過在既有代碼中加入少量它定義的各種 annotation,即能夠達(dá)到緩存方法的返回對(duì)象的效果

Spring 的緩存技術(shù)還具備相當(dāng)?shù)撵`活性。不僅能夠使用 SpEL(Spring Expression Language)來定義緩存的 key 和各種 condition,還提供開箱即用的緩存暫時(shí)存儲(chǔ)方案,也支持和主流的專業(yè)緩存比如 EHCache 集成

說人話:SpringCahce對(duì)緩存流程進(jìn)行了簡(jiǎn)化封裝,提供了一些注解,我們通過簡(jiǎn)單的打注解就能實(shí)現(xiàn)緩存的添加,修改,刪除等,注解如下:

  • @Cacheable:觸發(fā)緩存寫入
  • @CacheEvict:觸發(fā)緩存清除
  • @CachePut:更新緩存(不會(huì)影響到方法的運(yùn)行)
  • @Caching:重新組合要應(yīng)用于方法的多個(gè)緩存操作
  • @CacheConfig:設(shè)置類級(jí)別上共享的一些常見緩存設(shè)置

2.SpringCache大致原理

1.Spring Cache利用了AOP,實(shí)現(xiàn)了基于注解的緩存功能,并且進(jìn)行了合理的抽象,業(yè)務(wù)代碼不用關(guān)心底層是使用了什么緩存框架,只需要簡(jiǎn)單地加一個(gè)注解,就能實(shí)現(xiàn)緩存功能了,做到了對(duì)代碼侵入性做小。

2.由于市面上的緩存工具實(shí)在太多,SpringCache框架還提供了CacheManager接口,可以實(shí)現(xiàn)降低對(duì)各種緩存框架的耦合。它不是具體的緩存實(shí)現(xiàn),它只提供一整套的接口和代碼規(guī)范、配置、注解等,用于整合各種緩存方案,比如Caffeine、Guava Cache、Ehcache。

3.SpringCache注解

3.1. @Cacheable:寫緩存

方式一:@Cacheable可以用來進(jìn)行緩存的寫入,先也會(huì)根據(jù)緩存名和key去查詢,如果沒有查詢到,自動(dòng)將方法的返回結(jié)果存儲(chǔ)在緩存中,以便于在后續(xù)調(diào)用的時(shí)候可以直接返回緩存中的值,而不必再執(zhí)行實(shí)際的方法

@Cacheable(cacheNames=“books”,key=”'book1'”)   // books::book1
public Book findBook(ISBN isbn) {.
  //查詢數(shù)據(jù)庫
  return 數(shù)據(jù);
}

方式二:一個(gè)方法可以對(duì)應(yīng)多個(gè)緩存名稱

@Cacheable(cacheNames={“books”, “isbns”},key=”'book1'”)
public Book findBook(ISBN isbn) {..…}

方式三@Cacheable的緩存名稱是可以配置動(dòng)態(tài)參數(shù)的,比如選擇傳入的參數(shù),如下: (以下示例是使用SpEL聲明,如果您不熟悉SpEL,可以閱讀Spring Expression Language)

@Cacheable(cacheNames=“books”, key=“#isbn”) //參數(shù)值作為Key
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
@Cacheable(cacheNames=“books”, key=“#isbn.rawNumber”)
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

方式四

@Cacheable還可以設(shè)置根據(jù)條件判斷是否需要緩存

condition:取決于給定的參數(shù)是否滿足條件
unless:取決于返回值是否滿足條件(除非)

以下是一個(gè)簡(jiǎn)單的例子:key有默認(rèn)的名字

@Cacheable(cacheNames=“book”, condition=“#name.length() < 32”) 
public Book findBook(String name)
@Cacheable(cacheNames=“book”,condition=“#name.length()<32”, unless=“#result.hardback”) 
public Book findBook(String name)

3.2. @CachePut:修改緩存

@CachePut:當(dāng)需要更新緩存而不干擾方法的運(yùn)行時(shí) ,可以使用該注解。也就是說,始終執(zhí)行該方法,并將結(jié)果放入緩存(已經(jīng)有緩存就更新緩存),注解參數(shù)與@Cacheable相同。 以下是一個(gè)簡(jiǎn)單的例子:

@CachePut(cacheNames="book", key="#isbn")
public Book updateBook(ISBN isbn, BookDescriptor descriptor) {
}

通常強(qiáng)烈建議不要對(duì)同一方法同時(shí)使用@CachePut和@Cacheable注解,因?yàn)樗鼈兙哂胁煌男袨???赡軙?huì)產(chǎn)生不可思議的BUG哦

3.3. @CacheEvict:刪除緩存

@CacheEvict:刪除緩存的注解,這對(duì)刪除舊的數(shù)據(jù)和無用的數(shù)據(jù)是非常有用的。這里還多了一個(gè)參數(shù)(allEntries),設(shè)置allEntries=true時(shí),可以對(duì)整個(gè)條目進(jìn)行批量刪除。 以下是個(gè)簡(jiǎn)單的例子:

@CacheEvict(cacheNames="books", key="'book1'") 
public void loadBooks(InputStream batch)
//對(duì)cacheNames進(jìn)行批量刪除
@CacheEvict(cacheNames="books", allEntries=true) 
public void loadBooks(InputStream batch)

3.4. @Caching:組合注解

@Caching在使用緩存的時(shí)候,有可能會(huì)同時(shí)進(jìn)行更新和刪除,會(huì)出現(xiàn)同時(shí)使用多個(gè)注解的情況。而@Caching可以實(shí)現(xiàn)。 以下是個(gè)簡(jiǎn)單的例子:

@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)

3.5. @CacheConfig: 統(tǒng)一配置

@CacheConfig:緩存提供了許多的注解選項(xiàng),但是有一些公用的操作,我們可以使用@CacheConfig在類上進(jìn)行全局設(shè)置。 以下是個(gè)簡(jiǎn)單的例子:

@CacheConfig(cacheName="books") 
public class BookRepositoryImpl implements BookRepository {
    //注意:如果沒有指定key的話,keyGenerator會(huì)自動(dòng)生成key導(dǎo)致刪除緩存失敗,所以下面的緩存操作需要指定key
    @Cacheable(key="'book1'")
    public Book findBook(ISBN isbn) {...}
}

4.SpringCache實(shí)戰(zhàn)

1.導(dǎo)入依賴

<!-- SpringCache依賴 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

2.配置SpringCache集成redis

/**
 * @Description: SpringCache配置
 * @Author: Neuronet
 * @Date: 2023/10/22 19:32
 **/
@Configuration
public class CacheConfig extends CachingConfigurerSupport {
    @Resource
    private RedisConnectionFactory factory;
    @Bean
    @Override
    public CacheResolver cacheResolver() {
        return new SimpleCacheResolver(cacheManager());
    }
    @Bean
    @Override
    public CacheErrorHandler errorHandler() {
        // 用于捕獲從Cache中進(jìn)行CRUD時(shí)的異常的回調(diào)處理器。
        return new SimpleCacheErrorHandler();
    }
    //緩存管理器
    @Bean
    @Override
    public CacheManager cacheManager() {
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                        .disableCachingNullValues() //不允許空值
                        .serializeValuesWith(RedisSerializationContext.SerializationPair
                                             //值使用JSON序列化
                                             .fromSerializer(new GenericJackson2JsonRedisSerializer()));
        return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();
    }
}

3.開啟springCache

在啟動(dòng)類注解:@EnableCaching

4.添加緩存

緩存注解不能加在內(nèi)部方法上,比如:方法A調(diào)用方法B,給方法B加上緩存注解會(huì)失效,因?yàn)閮?nèi)部方法調(diào)用代理會(huì)失效,在A方法上打注解即可

//會(huì)先根據(jù)articleType::typeTree從redis獲取,如果有直接用緩存的。如果沒有就執(zhí)行方法體的代碼查詢數(shù)據(jù)庫
@Cacheable(cacheNames = "articleType", key = "'typeTree'")
public List<ArticleType> getTypeTree() {
    Object obj = redisTemplate.opsForValue().get("typeTree");
        if(obj == null){//redis沒有
            List<ArticleType> typeTree = typeTree();
            redisTemplate.opsForValue().set("typeTree",typeTree);
            return typeTree;
        }
    return typeTree();
}

到此這篇關(guān)于SpringBoot集成Redis及SpringCache緩存管理的文章就介紹到這了,更多相關(guān)SpringBoot集成Redis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC 重定向參數(shù)RedirectAttributes實(shí)例

    SpringMVC 重定向參數(shù)RedirectAttributes實(shí)例

    這篇文章主要介紹了SpringMVC 重定向參數(shù)RedirectAttributes實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • IntelliJ IDEA基于Scala實(shí)現(xiàn)Git檢查工具

    IntelliJ IDEA基于Scala實(shí)現(xiàn)Git檢查工具

    這篇文章主要介紹了如何使用Scala實(shí)現(xiàn)自定義的Git檢查工具,大家可以基于本文的示例進(jìn)行擴(kuò)展與實(shí)現(xiàn),也可以進(jìn)行其他應(yīng)用方向的嘗試,感興趣的可以了解下
    2023-08-08
  • Java利用poi實(shí)現(xiàn)word表格轉(zhuǎn)excel

    Java利用poi實(shí)現(xiàn)word表格轉(zhuǎn)excel

    這篇文章主要為大家詳細(xì)介紹了Java如何利用poi實(shí)現(xiàn)word表格轉(zhuǎn)excel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • Java抽象的本質(zhì)解析

    Java抽象的本質(zhì)解析

    對(duì)于面向?qū)ο缶幊虂碚f,抽象是它的一大特征之一,在 Java 中可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)抽象的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • java生成json實(shí)現(xiàn)隱藏掉關(guān)鍵屬性

    java生成json實(shí)現(xiàn)隱藏掉關(guān)鍵屬性

    這篇文章主要介紹了java生成json實(shí)現(xiàn)隱藏掉關(guān)鍵屬性,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程

    Spring Boot 開發(fā)環(huán)境熱部署詳細(xì)教程

    這篇文章主要介紹了Spring Boot 開發(fā)環(huán)境熱部署,本文給大家介紹了Spring Boot 開發(fā)環(huán)境熱部署的原理及快速配置方法,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • springbatch的封裝與使用實(shí)例詳解

    springbatch的封裝與使用實(shí)例詳解

    主要實(shí)現(xiàn)批量數(shù)據(jù)的處理,我對(duì)batch進(jìn)行的封裝,提出了jobBase類型,具體job需要實(shí)現(xiàn)它即可。這篇文章主要介紹了springbatch的封裝與使用 ,需要的朋友可以參考下
    2019-04-04
  • 詳解Spring Boot應(yīng)用的啟動(dòng)和停止(start啟動(dòng))

    詳解Spring Boot應(yīng)用的啟動(dòng)和停止(start啟動(dòng))

    這篇文章主要介紹了詳解Spring Boot應(yīng)用的啟動(dòng)和停止(start啟動(dòng)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java?項(xiàng)目中使用遞歸的小結(jié)

    Java?項(xiàng)目中使用遞歸的小結(jié)

    在 Java 中,遞歸是指在方法的定義中調(diào)用自身的過程,遞歸是基于方法調(diào)用棧的原理實(shí)現(xiàn)的:當(dāng)一個(gè)方法被調(diào)用時(shí),會(huì)在調(diào)用棧中創(chuàng)建一個(gè)對(duì)應(yīng)的棧幀,包含方法的參數(shù)、局部變量和返回地址等信息,這篇文章主要介紹了Java?項(xiàng)目中對(duì)使用遞歸的理解分享,需要的朋友可以參考下
    2024-07-07
  • 詳解JVM如何判斷一個(gè)對(duì)象是否可以被回收

    詳解JVM如何判斷一個(gè)對(duì)象是否可以被回收

    在c++中,當(dāng)我們使用完某個(gè)對(duì)象的時(shí)候,需要顯示的將對(duì)象回收,在java中,jvm會(huì)幫助我們進(jìn)行垃圾回收,無需程序員自己寫代碼進(jìn)行回收,下面我們就來看看JVM是如何判斷一個(gè)對(duì)象是否可以被回收的吧
    2023-11-11

最新評(píng)論