成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

從零搭建SpringBoot腳手架中如何整合Redis作為緩存

這篇文章將為大家詳細(xì)講解有關(guān)從零搭建Spring Boot腳手架中如何整合redis作為緩存,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供成武網(wǎng)站建設(shè)、成武做網(wǎng)站、成武網(wǎng)站設(shè)計(jì)、成武網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、成武企業(yè)網(wǎng)站模板建站服務(wù),10余年成武做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

1. 前言

緩存是一個(gè)系統(tǒng)應(yīng)用必備的一種功能,除了在減輕數(shù)據(jù)庫(kù)的壓力之外。還在存儲(chǔ)一些短時(shí)效的數(shù)據(jù)場(chǎng)景中發(fā)揮著重大作用,比如存儲(chǔ)用戶Token短信驗(yàn)證碼等等,目前緩存的選型還是比較多的,EHCACHE、HAZELCAST、CAFFEINE、COUCHBASE以及本文要整合的REDIS。接下來我們將會(huì)在kono腳手架項(xiàng)目中集成Spring Cache以及Redis。

2. 整合目標(biāo)

使項(xiàng)目具有緩存功能,同時(shí)將默認(rèn)的JDK序列化修改為Jackson序列化以存儲(chǔ)一些對(duì)象,同時(shí)實(shí)現(xiàn)一些特定的個(gè)性化的緩存空間以滿足不同場(chǎng)景下的不同緩存TTL時(shí)間需求。

3. 依賴集成

目前只需要引入下面的依賴即可:

 <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-data-redis</artifactid>
</dependency>
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-cache</artifactid>
</dependency>
<dependency>
    <groupid>org.apache.commons</groupid>
    <artifactid>commons-pool2</artifactid>
</dependency>

默認(rèn)情況下spring-data-redis使用高性能的lettuce客戶端實(shí)現(xiàn),當(dāng)然你可以替換為老舊的jedis。

4. 緩存及Redis配置

緩存以及Redis相關(guān)的配置項(xiàng)分別為spring.cachespring.redis開頭的配置,這里比較簡(jiǎn)單的配置為:

spring:
  redis:
    host: localhost
    port: 6379
  cache:
#   type: REDIS
    redis:
    # 全局過期時(shí)間
      time-to-live: 120

5. RedisTemplate個(gè)性化

默認(rèn)情況下會(huì)有兩個(gè)模板類被注入Spring IoC供我們使用,需要個(gè)性化配置來滿足實(shí)際的開發(fā)。

一個(gè)是RedisTemplate<object, object>,主要用于對(duì)象緩存,其默認(rèn)使用JDK序列化,我們需要更改其序列化方式解決一些問題,比如Java 8日期問題、JSON序列化問題。需要我們重寫一下。

/**
 * Redis的一些自定義配置.
 *
 * @author felord.cn
 * @since 2020 /8/17 20:39
 */
@ConditionalOnClass(ObjectMapper.class)
@Configuration(proxyBeanMethods = false)
public class RedisConfiguration {
    /**
     * Redis template redis template.
     *
     * @param redisConnectionFactory the redis connection factory
     * @return the redis template
     */
    @Bean("redisTemplate")
    public RedisTemplate<object, object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<object, object> template = new RedisTemplate&lt;&gt;();
        template.setConnectionFactory(redisConnectionFactory);
        // 使用Jackson2JsonRedisSerialize 替換默認(rèn)序列化
        Jackson2JsonRedisSerializer<object> jackson2JsonRedisSerializer = initJacksonSerializer();
        // 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

    /**
     * 處理redis序列化問題
     * @return Jackson2JsonRedisSerializer
     */
    private Jackson2JsonRedisSerializer<object> initJacksonSerializer() {
        Jackson2JsonRedisSerializer<object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer&lt;&gt;(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //以下替代舊版本 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        om.activateDefaultTyping(om.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
        //bugFix Jackson2反序列化數(shù)據(jù)處理LocalDateTime類型時(shí)出錯(cuò)
        om.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS);
        // java8 時(shí)間支持
        om.registerModule(new JavaTimeModule());
        jackson2JsonRedisSerializer.setObjectMapper(om);
        return jackson2JsonRedisSerializer;
    }

}

另一個(gè)是StringRedisTemplate,主要處理鍵值都是字符串的緩存,采用默認(rèn)就好。

6. 緩存?zhèn)€性化

使用Spring Cache做緩存的時(shí)候,有針對(duì)不同的key設(shè)置不同過期時(shí)間的場(chǎng)景。比如Jwt Token我想設(shè)置為一周過期,而驗(yàn)證碼我想設(shè)置為五分鐘過期。這個(gè)怎么實(shí)現(xiàn)呢?需要我們個(gè)性化配置RedisCacheManager。首先我通過枚舉來定義這些緩存及其TTL時(shí)間。例如:

/**
 * 緩存定義枚舉
 *
 * @author felord.cn
 * @see cn.felord.kono.configuration.CacheConfiguration
 * @since 2020/8/17 21:40
 */

public enum CacheEnum {

    /**
     * 用戶jwt token 緩存空間 ttl 7天
     */
    JWT_TOKEN_CACHE("usrTkn", 7 * 24 * 60 * 60),
    /**
     * 驗(yàn)證碼緩存 5分鐘ttl
     */
    SMS_CAPTCHA_CACHE("smsCode", 5 * 60);

    /**
     * 緩存名稱
     */
    private final String cacheName;
    /**
     * 緩存過期秒數(shù)
     */
    private final int ttlSecond;

    CacheEnum(String cacheName, int ttlSecond) {
        this.cacheName = cacheName;
        this.ttlSecond = ttlSecond;
    }
    
    public String cacheName() {
        return this.cacheName;
    }


    public int ttlSecond() {
        return this.ttlSecond;
    }
}

這樣就能很清楚地描述個(gè)性化的緩存了。

然后我們通過向Spring IoC分別注入RedisCacheConfigurationRedisCacheManagerBuilderCustomizer 來個(gè)性化配置,你可以留意CacheEnum是如何工作的。如果你有其它的個(gè)性化需要也可以對(duì)這兩個(gè)配置類進(jìn)行定制化。

import cn.felord.kono.enumeration.CacheEnum;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;
import java.util.EnumSet;
import java.util.stream.Collectors;

/**
 * redis 緩存配置.
 *
 * @author felord.cn
 * @since 2020 /8/17 20:14
 */
@EnableCaching
@Configuration
public class CacheConfiguration {


    /**
     * Redis cache configuration.
     *
     * @param redisTemplate the redis template
     * @return the redis cache configuration
     */
    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(RedisTemplate<object, object> redisTemplate, CacheProperties cacheProperties) {
         // 參見 spring.cache.redis
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();

        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                // 緩存的序列化問題
                .serializeValuesWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(redisTemplate.getValueSerializer()));

        if (redisProperties.getTimeToLive() != null) {
            // 全局 TTL 時(shí)間
            redisCacheConfiguration = redisCacheConfiguration.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            // key 前綴值
            redisCacheConfiguration = redisCacheConfiguration.prefixCacheNameWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            // 默認(rèn)緩存null值 可以防止緩存穿透
            redisCacheConfiguration = redisCacheConfiguration.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            // 不使用key前綴
            redisCacheConfiguration = redisCacheConfiguration.disableKeyPrefix();
        }
        return redisCacheConfiguration;
    }


    /**
     * Redis cache manager 個(gè)性化配置緩存過期時(shí)間.
     * @see RedisCacheManager,CacheEnum
     * @return the redis cache manager builder customizer
     */
    @Bean
    public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer(RedisCacheConfiguration redisCacheConfiguration) {

        return builder -&gt; builder.cacheDefaults(redisCacheConfiguration)
                // 自定義的一些緩存配置初始化 主要是特定緩存及其ttl時(shí)間
                .withInitialCacheConfigurations(EnumSet.allOf(CacheEnum.class).stream()
                        .collect(Collectors.toMap(CacheEnum::cacheName,
                                cacheEnum -&gt; redisCacheConfiguration.entryTtl(Duration.ofSeconds(cacheEnum.ttlSecond())))));
    }

}

個(gè)性化的同時(shí)我們可以通過注解@EnableCaching開啟Spring Cache緩存支持。關(guān)于Spring Cache的細(xì)節(jié)可以通過文章Spring Cache詳解來了解。

從零搭建Spring Boot腳手架中如何整合Redis作為緩存

> 請(qǐng)注意,只有通過Spring Cache操作緩存才會(huì)達(dá)到上圖的效果。命令行操作需要顯式的聲明指令。

關(guān)于從零搭建Spring Boot腳手架中如何整合Redis作為緩存就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

分享標(biāo)題:從零搭建SpringBoot腳手架中如何整合Redis作為緩存
文章地址:http://jinyejixie.com/article16/ggijdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、響應(yīng)式網(wǎng)站企業(yè)網(wǎng)站制作、商城網(wǎng)站網(wǎng)站設(shè)計(jì)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
宝山区| 广平县| 肥东县| 仪征市| 洪雅县| 广河县| 雅安市| 武鸣县| 崇仁县| 清河县| 邵东县| 三明市| 阿克| 章丘市| 潞城市| 南川市| 全南县| 调兵山市| 和硕县| 庐江县| 平远县| 邯郸市| 巢湖市| 徐闻县| 慈利县| 白朗县| 麻栗坡县| 阿拉善盟| 蕲春县| 泰安市| 响水县| 利辛县| 和龙市| 永吉县| 顺义区| 镇雄县| 临颍县| 大石桥市| 临汾市| 普格县| 北宁市|