diff --git a/backend/src/main/java/com/yfd/platform/config/RedisConfig.java b/backend/src/main/java/com/yfd/platform/config/RedisConfig.java index afc69288..f57ac0e2 100644 --- a/backend/src/main/java/com/yfd/platform/config/RedisConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/RedisConfig.java @@ -5,15 +5,27 @@ import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +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.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; +import java.time.Duration; +import java.util.HashMap; +import java.util.Map; + @Configuration +@EnableCaching public class RedisConfig { @Bean @@ -21,19 +33,12 @@ public class RedisConfig { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - - Jackson2JsonRedisSerializer jsonSerializer = new Jackson2JsonRedisSerializer<>(objectMapper, Object.class); - StringRedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); - redisTemplate.setValueSerializer(jsonSerializer); - redisTemplate.setHashValueSerializer(jsonSerializer); + redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer()); + redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; @@ -45,4 +50,51 @@ public class RedisConfig { stringRedisTemplate.setConnectionFactory(redisConnectionFactory); return stringRedisTemplate; } + + @Bean + @Primary + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { + RedisCacheConfiguration defaultConfig = RedisCacheConfiguration.defaultCacheConfig() + .prefixCacheNameWith("qgc:") + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer())) + .entryTtl(Duration.ofMinutes(30)); + + Map cacheConfigs = new HashMap<>(); + cacheConfigs.put("dictCache", defaultConfig.entryTtl(Duration.ofHours(6))); + cacheConfigs.put("dataCache", defaultConfig.entryTtl(Duration.ofMinutes(5))); + + return RedisCacheManager.builder(redisConnectionFactory) + .cacheDefaults(defaultConfig) + .withInitialCacheConfigurations(cacheConfigs) + .build(); + } + + @Bean + public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + return new GenericJackson2JsonRedisSerializer(objectMapper); + } + + @Bean("customKeyGenerator") + public KeyGenerator customKeyGenerator() { + return (target, method, params) -> { + StringBuilder sb = new StringBuilder(); + sb.append(target.getClass().getSimpleName()); + sb.append(":"); + sb.append(method.getName()); + sb.append(":"); + for (Object param : params) { + sb.append(param != null ? param.toString() : "null"); + sb.append(","); + } + if (sb.length() > 0 && sb.charAt(sb.length() - 1) == ',') { + sb.deleteCharAt(sb.length() - 1); + } + return sb.toString(); + }; + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java index 8d2fa828..96b2c3b2 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/SdHycdDicServiceImpl.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yfd.platform.qgc_base.domain.SdHycdDic; import com.yfd.platform.qgc_base.mapper.SdHycdDicMapper; import com.yfd.platform.qgc_base.service.ISdHycdDicService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.List; @@ -27,6 +29,7 @@ public class SdHycdDicServiceImpl extends ServiceImpl getByPhycd(String phycd) { return this.lambdaQuery() .eq(SdHycdDic::getPhycd, phycd) @@ -35,6 +38,7 @@ public class SdHycdDicServiceImpl extends ServiceImpl getRootList() { return this.lambdaQuery() .eq(SdHycdDic::getPhycd, "0") @@ -43,21 +47,25 @@ public class SdHycdDicServiceImpl extends ServiceImpl selectForDropdown(String hynm, Integer grd, Integer lx,String phycd) { return this.lambdaQuery() .like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm) @@ -69,6 +77,7 @@ public class SdHycdDicServiceImpl extends ServiceImpl regDropdown(String hynm, Integer grd,Integer lx,String phycd) { return this.lambdaQuery() .like(hynm != null && !hynm.isEmpty(), SdHycdDic::getHynm, hynm)