From d74f7180a8b693a82e76e0e2b3e9910cafc3fb46 Mon Sep 17 00:00:00 2001 From: luzhengwang Date: Mon, 22 Jan 2024 15:56:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0SpringCache=E6=B3=A8=E8=A7=A3?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=B0=86=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=AD=98=E5=82=A8=E8=87=B3Redis=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/configure/RedisConfig.java | 85 ++++++++++++++++++- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/pearadmin/common/configure/RedisConfig.java b/src/main/java/com/pearadmin/common/configure/RedisConfig.java index 830e7b35..3df87176 100644 --- a/src/main/java/com/pearadmin/common/configure/RedisConfig.java +++ b/src/main/java/com/pearadmin/common/configure/RedisConfig.java @@ -1,13 +1,27 @@ package com.pearadmin.common.configure; -import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; +import java.io.Serializable; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.Cache; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.CacheErrorHandler; 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.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; -import java.io.Serializable; +import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; + +import lombok.extern.slf4j.Slf4j; /** * Redis Template 配置文件 @@ -15,17 +29,80 @@ import java.io.Serializable; * @serial 2.0.0 * @author 就眠儀式 */ +@Slf4j @Configuration +@EnableCaching // 添加支持缓存注解 public class RedisConfig { + // 缓存生存时间 + @Value("${spring.redis.timeout:3600}") + private long timeout; + @Bean - public RedisTemplate - redisTemplate(LettuceConnectionFactory connectionFactory) { + public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericFastJsonRedisSerializer()); redisTemplate.setConnectionFactory(connectionFactory); return redisTemplate; } + + /** + * SpringCache 缓存配置 + * @author deer + * @date 2024年1月22日 + * @param connectionFactory + * @return + */ + @Bean + public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { + // redis缓存配置 + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMinutes(timeout)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer())) + .disableCachingNullValues(); + // 缓存配置map + Map cacheConfigurationMap = new HashMap<>(); + // 根据redis缓存配置和redis连接工厂生成redis缓存管理器 + RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).cacheDefaults(config) + .transactionAware().withInitialCacheConfigurations(cacheConfigurationMap).build(); + return redisCacheManager; + } + + /** + * 缓存异常处理 + * 用于当redis连接不上时被缓存注解标注的方法绕过Redis直连数据库 + * @author deer + * @date 2024年1月22日 + * @return + */ + @Bean + public CacheErrorHandler errorHandler() { + CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() { + + @Override + public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) { + log.error("redis异常:key=[{}]", key, exception); + } + + @Override + public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) { + log.error("redis异常:key=[{}]", key, exception); + } + + @Override + public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) { + log.error("redis异常:key=[{}]", key, exception); + } + + @Override + public void handleCacheClearError(RuntimeException exception, Cache cache) { + log.error("redis异常:", exception); + } + }; + + return cacheErrorHandler; + } } -- Gitee