diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java index 83933a1d..d6934a8a 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum; +import java.io.Serial; +import java.io.Serializable; import java.time.LocalDateTime; /** @@ -19,7 +21,10 @@ import java.time.LocalDateTime; */ @Data @TableName("t_category") -public class CategoryEntity { +public class CategoryEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) private Long categoryId; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java index 3c55b658..6fbd0e0a 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java @@ -3,6 +3,8 @@ package net.lab1024.sa.admin.module.business.category.domain.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.io.Serial; +import java.io.Serializable; import java.util.List; /** @@ -15,7 +17,10 @@ import java.util.List; * @Copyright 1024创新实验室 */ @Data -public class CategoryTreeVO { +public class CategoryTreeVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; @Schema(description = "类目id") private Long categoryId; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java index 3566f877..def0c314 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java @@ -3,6 +3,8 @@ package net.lab1024.sa.admin.module.system.department.domain.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.io.Serial; +import java.io.Serializable; import java.time.LocalDateTime; /** @@ -15,7 +17,10 @@ import java.time.LocalDateTime; * @Copyright 1024创新实验室 */ @Data -public class DepartmentVO { +public class DepartmentVO implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; @Schema(description = "部门id") private Long departmentId; diff --git a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java index adaacdb3..de25e80a 100644 --- a/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java +++ b/smart-admin-api-java17-springboot3/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java @@ -7,7 +7,7 @@ import jakarta.annotation.Resource; import net.lab1024.sa.base.common.controller.SupportBaseController; import net.lab1024.sa.base.common.domain.ResponseDTO; import net.lab1024.sa.base.constant.SwaggerTagConst; -import net.lab1024.sa.base.module.support.cache.CacheService; +import net.lab1024.sa.base.module.support.cache.service.CacheService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/config/CacheConfig.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/config/CacheConfig.java new file mode 100644 index 00000000..fe7c85cb --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/config/CacheConfig.java @@ -0,0 +1,35 @@ +package net.lab1024.sa.base.module.support.cache.config; + +import net.lab1024.sa.base.module.support.cache.service.CacheService; +import net.lab1024.sa.base.module.support.cache.service.CaffeineCacheServiceImpl; +import net.lab1024.sa.base.module.support.cache.service.RedisCacheServiceImpl; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 缓存配置 + * + * @author zhoumingfa + * @date 2025/03/28 + */ +@Configuration +public class CacheConfig { + + private static final String REDIS_CACHE = "redis"; + private static final String CAFFEINE_CACHE = "caffeine"; + + + @Bean + @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = REDIS_CACHE) + public CacheService redisCacheService() { + return new RedisCacheServiceImpl(); + } + + @Bean + @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = CAFFEINE_CACHE) + public CacheService caffeineCacheService() { + return new CaffeineCacheServiceImpl(); + } + +} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/CacheService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/CacheService.java new file mode 100644 index 00000000..e0742b66 --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/CacheService.java @@ -0,0 +1,34 @@ +package net.lab1024.sa.base.module.support.cache.service; + +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 缓存服务 + * + * @Author 1024创新实验室: 罗伊 + * @Date 2021/10/11 20:07 + * @Wechat zhuoda1024 + * @Email lab1024@163.com + * @Copyright 1024创新实验室 + */ +@Service +public interface CacheService { + + /** + * 获取所有缓存名称 + */ + List cacheNames(); + + /** + * 某个缓存下的所有 key + */ + List cacheKey(String cacheName); + + /** + * 移除某个 key + */ + void removeCache(String cacheName); + +} diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/CaffeineCacheServiceImpl.java similarity index 85% rename from smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java rename to smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/CaffeineCacheServiceImpl.java index 0229b3f4..b07ab1fa 100644 --- a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/CaffeineCacheServiceImpl.java @@ -1,4 +1,4 @@ -package net.lab1024.sa.base.module.support.cache; +package net.lab1024.sa.base.module.support.cache.service; import com.google.common.collect.Lists; import jakarta.annotation.Resource; @@ -6,7 +6,6 @@ import net.lab1024.sa.base.constant.ReloadConst; import net.lab1024.sa.base.module.support.reload.core.annoation.SmartReload; import org.springframework.cache.caffeine.CaffeineCache; import org.springframework.cache.caffeine.CaffeineCacheManager; -import org.springframework.stereotype.Service; import java.util.Collection; import java.util.List; @@ -14,32 +13,31 @@ import java.util.Set; import java.util.stream.Collectors; /** - * 缓存操作 + * caffeine 缓存实现 * * @Author 1024创新实验室: 罗伊 * @Date 2021/10/11 20:07 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ -@Service -public class CacheService { +public class CaffeineCacheServiceImpl implements CacheService { @Resource private CaffeineCacheManager caffeineCacheManager; /** * 获取所有缓存名称 - * */ + @Override public List cacheNames() { return Lists.newArrayList(caffeineCacheManager.getCacheNames()); } /** - * 某个缓存下的所有key - * + * 某个缓存下的所有 key */ + @Override public List cacheKey(String cacheName) { CaffeineCache cache = (CaffeineCache) caffeineCacheManager.getCache(cacheName); if (cache == null) { @@ -50,10 +48,9 @@ public class CacheService { } /** - * 移除某个key - * + * 移除某个 key */ - + @Override public void removeCache(String cacheName) { CaffeineCache cache = (CaffeineCache) caffeineCacheManager.getCache(cacheName); if (cache != null) { diff --git a/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/RedisCacheServiceImpl.java b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/RedisCacheServiceImpl.java new file mode 100644 index 00000000..5efeb3ca --- /dev/null +++ b/smart-admin-api-java17-springboot3/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/service/RedisCacheServiceImpl.java @@ -0,0 +1,86 @@ +package net.lab1024.sa.base.module.support.cache.service; + +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Lists; +import jakarta.annotation.Resource; +import net.lab1024.sa.base.constant.ReloadConst; +import net.lab1024.sa.base.module.support.reload.core.annoation.SmartReload; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; + +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * redis 缓存实现 + * + * @author zhoumingfa + * @date 2025/3/28 + */ +public class RedisCacheServiceImpl implements CacheService { + + @Resource + private RedisCacheManager redisCacheManager; + + @Resource + private RedisConnectionFactory redisConnectionFactory; + + /** + * 获取所有缓存名称 + */ + @Override + public List cacheNames() { + return Lists.newArrayList(redisCacheManager.getCacheNames()); + } + + /** + * 某个缓存下的所有 key + */ + @Override + public List cacheKey(String cacheName) { + RedisCache cache = (RedisCache) redisCacheManager.getCache(cacheName); + if (cache == null) { + return Lists.newArrayList(); + } + // 获取 Redis 连接 + RedisConnection connection = redisConnectionFactory.getConnection(); + // 根据指定的 key 模式获取所有匹配的键 + Set keys = connection.keyCommands().keys((cacheName + ":*").getBytes()); + + if (keys != null) { + return keys.stream().map(key -> { + String redisKey = StrUtil.str(key, "utf-8"); + // 从 Redis 键中提取出最后一个冒号后面的字符串作为真正的键 + return redisKey.substring(redisKey.lastIndexOf(":") + 1); + }).collect(Collectors.toList()); + } + connection.close(); + return Lists.newArrayList(cacheName); + } + + /** + * 移除某个 key + */ + @Override + public void removeCache(String cacheName) { + RedisCache cache = (RedisCache) redisCacheManager.getCache(cacheName); + if (cache != null) { + cache.clear(); + } + } + + @SmartReload(ReloadConst.CACHE_SERVICE) + public void clearAllCache() { + Collection cacheNames = redisCacheManager.getCacheNames(); + for (String name : cacheNames) { + RedisCache cache = (RedisCache) redisCacheManager.getCache(name); + if (cache != null) { + cache.clear(); + } + } + } +} diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java index 83933a1d..4b0b348c 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/entity/CategoryEntity.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import net.lab1024.sa.admin.module.business.category.constant.CategoryTypeEnum; +import java.io.Serializable; import java.time.LocalDateTime; /** @@ -19,7 +20,9 @@ import java.time.LocalDateTime; */ @Data @TableName("t_category") -public class CategoryEntity { +public class CategoryEntity implements Serializable { + + private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) private Long categoryId; diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java index 3c55b658..bbd7fb4a 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/category/domain/vo/CategoryTreeVO.java @@ -3,6 +3,7 @@ package net.lab1024.sa.admin.module.business.category.domain.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.io.Serializable; import java.util.List; /** @@ -15,7 +16,9 @@ import java.util.List; * @Copyright 1024创新实验室 */ @Data -public class CategoryTreeVO { +public class CategoryTreeVO implements Serializable { + + private static final long serialVersionUID = 1L; @Schema(description = "类目id") private Long categoryId; diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java index 3566f877..fc591634 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java @@ -3,6 +3,7 @@ package net.lab1024.sa.admin.module.system.department.domain.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.io.Serializable; import java.time.LocalDateTime; /** @@ -15,7 +16,9 @@ import java.time.LocalDateTime; * @Copyright 1024创新实验室 */ @Data -public class DepartmentVO { +public class DepartmentVO implements Serializable { + + private static final long serialVersionUID = 1L; @Schema(description = "部门id") private Long departmentId; diff --git a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java index 9696e5ec..b6b5906e 100644 --- a/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java +++ b/smart-admin-api-java8-springboot2/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminCacheController.java @@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.Operation; import net.lab1024.sa.base.common.controller.SupportBaseController; import net.lab1024.sa.base.common.domain.ResponseDTO; import net.lab1024.sa.base.constant.SwaggerTagConst; -import net.lab1024.sa.base.module.support.cache.CacheService; +import net.lab1024.sa.base.module.support.cache.cache.service.CacheService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/config/CacheConfig.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/config/CacheConfig.java new file mode 100644 index 00000000..20afcf34 --- /dev/null +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/config/CacheConfig.java @@ -0,0 +1,35 @@ +package net.lab1024.sa.base.module.support.cache.cache.config; + +import net.lab1024.sa.base.module.support.cache.cache.service.CacheService; +import net.lab1024.sa.base.module.support.cache.cache.service.CaffeineCacheServiceImpl; +import net.lab1024.sa.base.module.support.cache.cache.service.RedisCacheServiceImpl; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 缓存配置 + * + * @author zhoumingfa + * @date 2025/03/28 + */ +@Configuration +public class CacheConfig { + + private static final String REDIS_CACHE = "redis"; + private static final String CAFFEINE_CACHE = "caffeine"; + + + @Bean + @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = REDIS_CACHE) + public CacheService redisCacheService() { + return new RedisCacheServiceImpl(); + } + + @Bean + @ConditionalOnProperty(prefix = "spring.cache", name = {"type"}, havingValue = CAFFEINE_CACHE) + public CacheService caffeineCacheService() { + return new CaffeineCacheServiceImpl(); + } + +} diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/CacheService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/CacheService.java new file mode 100644 index 00000000..c883386e --- /dev/null +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/CacheService.java @@ -0,0 +1,34 @@ +package net.lab1024.sa.base.module.support.cache.cache.service; + +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 缓存服务 + * + * @Author 1024创新实验室: 罗伊 + * @Date 2021/10/11 20:07 + * @Wechat zhuoda1024 + * @Email lab1024@163.com + * @Copyright 1024创新实验室 + */ +@Service +public interface CacheService { + + /** + * 获取所有缓存名称 + */ + List cacheNames(); + + /** + * 某个缓存下的所有 key + */ + List cacheKey(String cacheName); + + /** + * 移除某个 key + */ + void removeCache(String cacheName); + +} diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/CaffeineCacheServiceImpl.java similarity index 84% rename from smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java rename to smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/CaffeineCacheServiceImpl.java index 16326aa0..2f18a782 100644 --- a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/CacheService.java +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/CaffeineCacheServiceImpl.java @@ -1,11 +1,10 @@ -package net.lab1024.sa.base.module.support.cache; +package net.lab1024.sa.base.module.support.cache.cache.service; import com.google.common.collect.Lists; import net.lab1024.sa.base.constant.ReloadConst; import net.lab1024.sa.base.module.support.reload.core.annoation.SmartReload; import org.springframework.cache.caffeine.CaffeineCache; import org.springframework.cache.caffeine.CaffeineCacheManager; -import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Collection; @@ -14,32 +13,31 @@ import java.util.Set; import java.util.stream.Collectors; /** - * 缓存操作 + * caffeine 缓存实现 * * @Author 1024创新实验室: 罗伊 * @Date 2021/10/11 20:07 * @Wechat zhuoda1024 * @Email lab1024@163.com - * @Copyright 1024创新实验室 + * @Copyright 1024创新实验室 */ -@Service -public class CacheService { +public class CaffeineCacheServiceImpl implements CacheService { @Resource private CaffeineCacheManager caffeineCacheManager; /** * 获取所有缓存名称 - * */ + @Override public List cacheNames() { return Lists.newArrayList(caffeineCacheManager.getCacheNames()); } /** - * 某个缓存下的所有key - * + * 某个缓存下的所有 key */ + @Override public List cacheKey(String cacheName) { CaffeineCache cache = (CaffeineCache) caffeineCacheManager.getCache(cacheName); if (cache == null) { @@ -50,10 +48,9 @@ public class CacheService { } /** - * 移除某个key - * + * 移除某个 key */ - + @Override public void removeCache(String cacheName) { CaffeineCache cache = (CaffeineCache) caffeineCacheManager.getCache(cacheName); if (cache != null) { diff --git a/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/RedisCacheServiceImpl.java b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/RedisCacheServiceImpl.java new file mode 100644 index 00000000..5a1a7e36 --- /dev/null +++ b/smart-admin-api-java8-springboot2/sa-base/src/main/java/net/lab1024/sa/base/module/support/cache/cache/service/RedisCacheServiceImpl.java @@ -0,0 +1,86 @@ +package net.lab1024.sa.base.module.support.cache.cache.service; + +import cn.hutool.core.util.StrUtil; +import com.google.common.collect.Lists; +import net.lab1024.sa.base.constant.ReloadConst; +import net.lab1024.sa.base.module.support.reload.core.annoation.SmartReload; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; + +import javax.annotation.Resource; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * redis 缓存实现 + * + * @author zhoumingfa + * @date 2025/3/28 + */ +public class RedisCacheServiceImpl implements CacheService { + + @Resource + private RedisCacheManager redisCacheManager; + + @Resource + private RedisConnectionFactory redisConnectionFactory; + + /** + * 获取所有缓存名称 + */ + @Override + public List cacheNames() { + return Lists.newArrayList(redisCacheManager.getCacheNames()); + } + + /** + * 某个缓存下的所有 key + */ + @Override + public List cacheKey(String cacheName) { + RedisCache cache = (RedisCache) redisCacheManager.getCache(cacheName); + if (cache == null) { + return Lists.newArrayList(); + } + // 获取 Redis 连接 + RedisConnection connection = redisConnectionFactory.getConnection(); + // 根据指定的 key 模式获取所有匹配的键 + Set keys = connection.keyCommands().keys((cacheName + ":*").getBytes()); + + if (keys != null) { + return keys.stream().map(key -> { + String redisKey = StrUtil.str(key, "utf-8"); + // 从 Redis 键中提取出最后一个冒号后面的字符串作为真正的键 + return redisKey.substring(redisKey.lastIndexOf(":") + 1); + }).collect(Collectors.toList()); + } + connection.close(); + return Lists.newArrayList(cacheName); + } + + /** + * 移除某个 key + */ + @Override + public void removeCache(String cacheName) { + RedisCache cache = (RedisCache) redisCacheManager.getCache(cacheName); + if (cache != null) { + cache.clear(); + } + } + + @SmartReload(ReloadConst.CACHE_SERVICE) + public void clearAllCache() { + Collection cacheNames = redisCacheManager.getCacheNames(); + for (String name : cacheNames) { + RedisCache cache = (RedisCache) redisCacheManager.getCache(name); + if (cache != null) { + cache.clear(); + } + } + } +}