From 015615644068d49b5c950a30fb4408d381474084 Mon Sep 17 00:00:00 2001 From: ziin Date: Wed, 17 Dec 2025 16:25:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(character):=20=E6=B7=BB=E5=8A=A0Redis?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=94=AF=E6=8C=81=E4=BA=BA=E8=AE=BE=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yolo/keyborad/config/RedisConfig.java | 27 ++++++++++- .../listener/CharacterCacheInitializer.java | 45 +++++++++++++++++++ .../impl/KeyboardCharacterServiceImpl.java | 21 +++++++-- 3 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/yolo/keyborad/listener/CharacterCacheInitializer.java diff --git a/src/main/java/com/yolo/keyborad/config/RedisConfig.java b/src/main/java/com/yolo/keyborad/config/RedisConfig.java index 76fe01a..b6a24f4 100644 --- a/src/main/java/com/yolo/keyborad/config/RedisConfig.java +++ b/src/main/java/com/yolo/keyborad/config/RedisConfig.java @@ -24,7 +24,7 @@ public class RedisConfig { public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(connectionFactory); - + // 设置key序列化方式 template.setKeySerializer(new StringRedisSerializer()); // 设置value序列化方式 @@ -33,7 +33,30 @@ public class RedisConfig { template.setHashKeySerializer(new StringRedisSerializer()); // 设置hash value序列化方式 template.setHashValueSerializer(new StringRedisSerializer()); - + + template.afterPropertiesSet(); + return template; + } + + /** + * 配置对象序列化的RedisTemplate + * @param connectionFactory Redis连接工厂 + * @return RedisTemplate实例 + */ + @Bean("objectRedisTemplate") + public org.springframework.data.redis.core.RedisTemplate objectRedisTemplate(RedisConnectionFactory connectionFactory) { + org.springframework.data.redis.core.RedisTemplate template = new org.springframework.data.redis.core.RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + // 设置key序列化方式 + template.setKeySerializer(new StringRedisSerializer()); + // 设置value序列化方式(使用JSON序列化) + template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + // 设置hash key序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + // 设置hash value序列化方式 + template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + template.afterPropertiesSet(); return template; } diff --git a/src/main/java/com/yolo/keyborad/listener/CharacterCacheInitializer.java b/src/main/java/com/yolo/keyborad/listener/CharacterCacheInitializer.java new file mode 100644 index 0000000..2d9ca60 --- /dev/null +++ b/src/main/java/com/yolo/keyborad/listener/CharacterCacheInitializer.java @@ -0,0 +1,45 @@ +package com.yolo.keyborad.listener; + +import com.yolo.keyborad.model.entity.KeyboardCharacter; +import com.yolo.keyborad.service.KeyboardCharacterService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 人设缓存初始化器 + * 在应用启动时将所有人设缓存到Redis + */ +@Component +@Slf4j +public class CharacterCacheInitializer implements ApplicationRunner { + + private static final String CHARACTER_CACHE_KEY = "character:"; + + @Resource + private KeyboardCharacterService characterService; + + @Resource(name = "objectRedisTemplate") + private RedisTemplate redisTemplate; + + @Override + public void run(ApplicationArguments args) { + try { + log.info("开始缓存人设列表到Redis..."); + List characters = characterService.list(); + for (KeyboardCharacter character : characters) { + String key = CHARACTER_CACHE_KEY + character.getId(); + redisTemplate.opsForValue().set(key, character, 7, TimeUnit.DAYS); + } + log.info("人设列表缓存完成,共缓存 {} 条记录", characters.size()); + } catch (Exception e) { + log.error("缓存人设列表失败", e); + } + } +} diff --git a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java index d6f3dc0..867484f 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/KeyboardCharacterServiceImpl.java @@ -36,6 +36,8 @@ import java.util.stream.Stream; @Service public class KeyboardCharacterServiceImpl extends ServiceImpl implements KeyboardCharacterService{ + private static final String CHARACTER_CACHE_KEY = "character:"; + @Resource private KeyboardCharacterMapper keyboardCharacterMapper; @@ -45,6 +47,22 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl redisTemplate; + + @Override + public KeyboardCharacter getById(java.io.Serializable id) { + String key = CHARACTER_CACHE_KEY + id; + KeyboardCharacter character = (KeyboardCharacter) redisTemplate.opsForValue().get(key); + if (character == null) { + character = super.getById(id); + if (character != null) { + redisTemplate.opsForValue().set(key, character, 7, java.util.concurrent.TimeUnit.DAYS); + } + } + return character; + } + @Override public List selectListWithRank() { long userId = StpUtil.getLoginIdAsLong(); @@ -61,9 +79,6 @@ public class KeyboardCharacterServiceImpl extends ServiceImpl