這篇文章將為大家詳細(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ù)。
緩存是一個(gè)系統(tǒng)應(yīng)用必備的一種功能,除了在減輕數(shù)據(jù)庫(kù)的壓力之外。還在存儲(chǔ)一些短時(shí)效的數(shù)據(jù)場(chǎng)景中發(fā)揮著重大作用,比如存儲(chǔ)用戶Token、短信驗(yàn)證碼等等,目前緩存的選型還是比較多的,EHCACHE、HAZELCAST、CAFFEINE、COUCHBASE以及本文要整合的REDIS。接下來(lái)我們將會(huì)在kono腳手架項(xiàng)目中集成Spring Cache以及Redis。
使項(xiàng)目具有緩存功能,同時(shí)將默認(rèn)的JDK序列化修改為Jackson序列化以存儲(chǔ)一些對(duì)象,同時(shí)實(shí)現(xiàn)一些特定的個(gè)性化的緩存空間以滿足不同場(chǎng)景下的不同緩存TTL時(shí)間需求。
目前只需要引入下面的依賴即可:
org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-cache org.apache.commons commons-pool2
默認(rèn)情況下spring-data-redis使用高性能的lettuce客戶端實(shí)現(xiàn),當(dāng)然你可以替換為老舊的jedis。
緩存以及Redis相關(guān)的配置項(xiàng)分別為spring.cache
和spring.redis
開頭的配置,這里比較簡(jiǎn)單的配置為:
spring: redis: host: localhost port: 6379 cache: # type: REDIS redis: # 全局過(guò)期時(shí)間 time-to-live: 120
默認(rèn)情況下會(huì)有兩個(gè)模板類被注入Spring IoC供我們使用,需要個(gè)性化配置來(lái)滿足實(shí)際的開發(fā)。
一個(gè)是RedisTemplate
,主要用于對(duì)象緩存,其默認(rèn)使用JDK序列化,我們需要更改其序列化方式解決一些問(wèn)題,比如Java 8日期問(wèn)題、JSON序列化問(wèn)題。需要我們重寫一下。
/** * 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
另一個(gè)是StringRedisTemplate
,主要處理鍵值都是字符串的緩存,采用默認(rèn)就好。
使用Spring Cache做緩存的時(shí)候,有針對(duì)不同的key設(shè)置不同過(guò)期時(shí)間的場(chǎng)景。比如Jwt Token我想設(shè)置為一周過(guò)期,而驗(yàn)證碼我想設(shè)置為五分鐘過(guò)期。這個(gè)怎么實(shí)現(xiàn)呢?需要我們個(gè)性化配置RedisCacheManager
。首先我通過(guò)枚舉來(lái)定義這些緩存及其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; /** * 緩存過(guò)期秒數(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è)性化的緩存了。
然后我們通過(guò)向Spring IoC分別注入RedisCacheConfiguration
和RedisCacheManagerBuilderCustomizer
來(lái)個(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(RedisTemplateredisTemplate, CacheProperties cacheProperties) { // 參見(jiàn) spring.cache.redis CacheProperties.Redis redisProperties = cacheProperties.getRedis(); RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() // 緩存的序列化問(wèn)題 .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è)性化配置緩存過(guò)期時(shí)間. * @see RedisCacheManager,CacheEnum * @return the redis cache manager builder customizer */ @Bean public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer(RedisCacheConfiguration redisCacheConfiguration) { return builder -> builder.cacheDefaults(redisCacheConfiguration) // 自定義的一些緩存配置初始化 主要是特定緩存及其ttl時(shí)間 .withInitialCacheConfigurations(EnumSet.allOf(CacheEnum.class).stream() .collect(Collectors.toMap(CacheEnum::cacheName, cacheEnum -> redisCacheConfiguration.entryTtl(Duration.ofSeconds(cacheEnum.ttlSecond()))))); } }
個(gè)性化的同時(shí)我們可以通過(guò)注解@EnableCaching
開啟Spring Cache緩存支持。關(guān)于Spring Cache的細(xì)節(jié)可以通過(guò)文章Spring Cache詳解來(lái)了解。
> 請(qǐng)注意,只有通過(guò)Spring Cache操作緩存才會(huì)達(dá)到上圖的效果。命令行操作需要顯式的聲明指令。
關(guān)于從零搭建Spring Boot腳手架中如何整合Redis作為緩存就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。