Spring?Boot?整合?Redis?實(shí)現(xiàn)數(shù)據(jù)緩存案例詳解
Spring Boot 緩存,默認(rèn)使用的是 ConcurrentMap 的方式來(lái)實(shí)現(xiàn)的,然而我們?cè)陧?xiàng)目中并不會(huì)這么使用。我們經(jīng)常會(huì)引入第三方緩存框架,來(lái)完成對(duì)數(shù)據(jù)的緩存操作。比如說(shuō):Redis 。本文就來(lái)介紹 Spring Boot 整合 Redis 來(lái)實(shí)現(xiàn)數(shù)據(jù)的緩存。
1.添加 Maven 依賴
<!--引入 redis starter 的maven依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
2.配置redis屬性
spring.redis.host=192.168.204.211 spring.redis.port=6379 spring.redis.password=xxx spring.redis.database=0 # 設(shè)置連接池配置等(如有需要) spring.redis.lettuce.pool.max-active=xxx spring.redis.lettuce.pool.max-idle=xxx
配置好 redis 相關(guān)屬性之后,Spring Boot 在項(xiàng)目啟動(dòng)時(shí),便會(huì)自動(dòng)為我們注入 redisTemplate、stringRedisTemplate 組件。因?yàn)槲覀儾僮骶彺娲蠖鄶?shù)都是對(duì)字符串進(jìn)行操作。所以為我們專門(mén)抽取出來(lái)的一個(gè) stringRedisTemplate 組件,方便我們的使用。
3.創(chuàng)建 redisCacheManager
引入 redis 來(lái)實(shí)現(xiàn)緩存,此時(shí)我們便使用 RedisCacheManager 來(lái)進(jìn)行管理了。我們?cè)谑褂?RedisCacheManager 來(lái)操作 redis 時(shí),底層操作默認(rèn)使用的是 RedisTemplate,而 redisTemplate 是 redisAutoConfiguration 在項(xiàng)目啟動(dòng)時(shí)幫我們自動(dòng)注冊(cè)的組件,它默認(rèn)使用的是 JDK 序列化機(jī)制。所以在 redis 存儲(chǔ)時(shí),會(huì)出現(xiàn)類似亂碼的情況出現(xiàn)。所以我們需要來(lái)自己配置 redisCacheManager。

新建一個(gè)配置類 MyRedisConfig.java,使用@Configuration 注解來(lái)標(biāo)注該類是一個(gè)配置類。然后使用 @Bean 注解為 IOC 容器注冊(cè)我們自定義的 redisCacheManager,代碼如下所示:
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
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.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
/**
* 自定義 Redis緩存相關(guān)配置
*/
@EnableCaching
@Configuration
public class MyRedisConfig {
/**
* 自定義CacheManager管理器
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory){
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解決查詢緩存轉(zhuǎn)換異常的問(wèn)題
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//這一句必須要,作用是序列化時(shí)將對(duì)象全類名一起保存下來(lái)
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//配置序列化(解決亂碼的問(wèn)題)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(300))//設(shè)置 key 過(guò)期時(shí)間
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) //設(shè)置key序列化規(guī)則
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))//設(shè)置value序列化規(guī)則
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}4.使用Spring提供的注解,實(shí)現(xiàn)緩存數(shù)據(jù)到 Redis
使用 @Cacheable、@CachePut、@CacheEvict 等注解來(lái)實(shí)現(xiàn)緩存功能,此處不再過(guò)多介紹,可參考:Spring 緩存在項(xiàng)目中的使用。測(cè)試圖如下所示:

5.完成對(duì)操作過(guò)程中數(shù)據(jù)的緩存
使用 @Cacheable 等注解,都是將最終的結(jié)果進(jìn)行緩存。如果我們需要對(duì)過(guò)程中的部分?jǐn)?shù)據(jù)也進(jìn)行緩存,我們此時(shí)就需要使用 RedisCacheManager 來(lái)手動(dòng)操作。
/**
* 如果有多個(gè)cacheManager,也可以來(lái)手動(dòng)指定使用哪個(gè)
*/
@Override
@Cacheable(value = "user", key = "#root.methodName +'['+ #id +']'",cacheManager = "redisCacheManager")
public User getUser(Integer id) {
log.info("用戶"+id+"開(kāi)始執(zhí)行數(shù)據(jù)庫(kù)查詢");
User user = userMapper.getUser(id);
return user;
}也可以直接使用CacheManager來(lái)對(duì)中間結(jié)果緩存
@Override
public User getUser(Integer id) {
log.info("用戶"+id+"開(kāi)始執(zhí)行數(shù)據(jù)庫(kù)查詢");
User user = userMapper.getUser(id);
//可以直接使用CacheManager來(lái)對(duì)中間結(jié)果緩存
Cache cache = cacheManager.getCache("user");
cache.put("test",1111);
return user;
}6.附 demo 實(shí)例
Spring Boot 整合 Redis 實(shí)現(xiàn)數(shù)據(jù)緩存
百度網(wǎng)盤(pán)下載地址:
鏈接: https://pan.baidu.com/s/16bNmeIynFTHJ88PGf5ux4A
提取碼: jm67
到此這篇關(guān)于Spring Boot 整合 Redis 實(shí)現(xiàn)數(shù)據(jù)緩存的文章就介紹到這了,更多相關(guān)Spring Boot Redis 數(shù)據(jù)緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot整合Redis實(shí)現(xiàn)高并發(fā)數(shù)據(jù)緩存的示例講解
- SpringBoot整合Redis實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存的示例代碼
- 詳解Spring Boot使用redis實(shí)現(xiàn)數(shù)據(jù)緩存
- SpringBoot+Redis實(shí)現(xiàn)分布式緩存的方法步驟
- springBoot整合redis做緩存具體操作步驟
- SpringBoot3.0集成Redis緩存的實(shí)現(xiàn)示例
- SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存管理功能
相關(guān)文章
java實(shí)現(xiàn)Rabbitmq延遲隊(duì)列和惰性隊(duì)列
本文主要介紹了java實(shí)現(xiàn)Rabbitmq延遲隊(duì)列和惰性隊(duì)列,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
關(guān)于SpringCloudStream配置問(wèn)題
這篇文章主要介紹了關(guān)于SpringCloudStream配置問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Java調(diào)用IK分詞器進(jìn)行分詞方式,封裝工具類
這篇文章主要介紹了Java調(diào)用IK分詞器進(jìn)行分詞方式,封裝工具類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
使用dynamic datasource springboot starter實(shí)現(xiàn)多數(shù)據(jù)源及源碼分析
這篇文章主要介紹了使用dynamic-datasource-spring-boot-starter做多數(shù)據(jù)源及源碼分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn)
本文主要介紹了IDEA2023 Maven3.9.1+Tomcat10.1.8配置并搭建Servlet5.0的框架實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
基于SpringBoot應(yīng)用監(jiān)控Actuator安全隱患及解決方式
這篇文章主要介紹了SpringBoot應(yīng)用監(jiān)控Actuator安全隱患及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
springboot定時(shí)任務(wù)不起作用問(wèn)題及解決
文章主要介紹了Spring Boot中延遲加載bean的概念,并討論了如何解決定時(shí)任務(wù)不執(zhí)行的問(wèn)題,通過(guò)設(shè)置`@Lazy(false)`注解,可以指定某些類不使用延遲加載,從而解決定時(shí)任務(wù)無(wú)法執(zhí)行的問(wèn)題2024-11-11
JSON數(shù)據(jù)轉(zhuǎn)換成Java對(duì)象的方法
就目前來(lái)講,將Java對(duì)象轉(zhuǎn)換成JSON對(duì)象還是相當(dāng)簡(jiǎn)單的,但是 將JSON對(duì)象轉(zhuǎn)換成Java對(duì)象,就相對(duì)比較復(fù)雜了些2014-03-03
簡(jiǎn)單談?wù)凧ava 中的線程的幾種狀態(tài)
這篇文章主要介紹了簡(jiǎn)單談?wù)凧ava 中的線程的幾種狀態(tài)的相關(guān)資料,需要的朋友可以參考下2020-02-02

