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

Spring?Boot?整合?Redis?實(shí)現(xiàn)數(shù)據(jù)緩存案例詳解

 更新時(shí)間:2025年05月22日 14:38:02   作者:扛麻袋的少年  
Springboot緩存,默認(rèn)使用的是ConcurrentMap的方式來(lái)實(shí)現(xiàn)的,然而我們?cè)陧?xiàng)目中并不會(huì)這么使用,本文介紹SpringBoot整合Redis來(lái)實(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論