diff --git a/kernel-d-cache/cache-sdk-redis/src/main/java/cn/stylefeng/roses/kernel/cache/redis/AbstractRedisHashCacheOperator.java b/kernel-d-cache/cache-sdk-redis/src/main/java/cn/stylefeng/roses/kernel/cache/redis/AbstractRedisHashCacheOperator.java new file mode 100644 index 000000000..3851c0561 --- /dev/null +++ b/kernel-d-cache/cache-sdk-redis/src/main/java/cn/stylefeng/roses/kernel/cache/redis/AbstractRedisHashCacheOperator.java @@ -0,0 +1,124 @@ +/* + * Copyright [2020-2030] [https://www.stylefeng.cn] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点: + * + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改Guns源码头部的版权声明。 + * 3.请保留源码和相关描述文件的项目出处,作者声明等。 + * 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns + * 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns + * 6.若您的项目无法满足以上几点,可申请商业授权 + */ +package cn.stylefeng.roses.kernel.cache.redis; + +import cn.hutool.core.collection.CollectionUtil; +import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + + +/** + * 基于redis的缓存封装,hash结构 + * + * @author stylefeng + * @date 2020/7/9 10:09 + */ +@SuppressWarnings("all") +public abstract class AbstractRedisHashCacheOperator implements CacheOperatorApi { + + private final RedisTemplate redisTemplate; + + public AbstractRedisHashCacheOperator(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @Override + public void put(String key, T value) { + redisTemplate.boundHashOps(getCommonKeyPrefix()).put(key, value); + } + + @Override + public void put(String key, T value, Long timeoutSeconds) { + // 不能设置单个的过期时间 + this.put(key, value); + } + + @Override + public T get(String key) { + return (T) redisTemplate.boundHashOps(getCommonKeyPrefix()).get(key); + } + + @Override + public void remove(String... key) { + redisTemplate.boundHashOps(getCommonKeyPrefix()).delete(key); + } + + @Override + public void expire(String key, Long expiredSeconds) { + // 设置整个hash的 + redisTemplate.boundHashOps(getCommonKeyPrefix()).expire(expiredSeconds, TimeUnit.SECONDS); + } + + @Override + public boolean contains(String key) { + return redisTemplate.boundHashOps(getCommonKeyPrefix()).hasKey(key); + } + + @Override + public Collection getAllKeys() { + Set keys = redisTemplate.boundHashOps(getCommonKeyPrefix()).keys(); + if (keys != null) { + // 去掉缓存key的common prefix前缀 + return keys.stream().map(Object::toString).collect(Collectors.toSet()); + } else { + return CollectionUtil.newHashSet(); + } + } + + @Override + public Collection getAllValues() { + Collection allKeys = getAllKeys(); + if (allKeys != null) { + return (Collection) redisTemplate.boundHashOps(getCommonKeyPrefix()).multiGet(Collections.singleton(allKeys)); + } else { + return CollectionUtil.newArrayList(); + } + } + + @Override + public Map getAllKeyValues() { + Collection allKeys = this.getAllKeys(); + HashMap results = CollectionUtil.newHashMap(); + for (String key : allKeys) { + results.put(key, this.get(key)); + } + return results; + } + + /** + * 获取RedisTemplate + * + * @author fengshuonan + * @date 2021/2/8 9:40 + */ + public RedisTemplate getRedisTemplate() { + return this.redisTemplate; + } + +} diff --git a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java index 9c422509c..b219b8bb7 100644 --- a/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java +++ b/kernel-d-scanner/scanner-api/src/main/java/cn/stylefeng/roses/kernel/scanner/api/constants/ScannerConstants.java @@ -45,7 +45,7 @@ public interface ScannerConstants { /** * 资源前缀标识 */ - String RESOURCE_CACHE_KEY = "GUNS_RESOURCE_CACHES:"; + String RESOURCE_CACHE_KEY = "GUNS_RESOURCE_CACHES"; /** * 资源汇报的监听器的顺序 diff --git a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/MemoryResourceCache.java b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/MemoryResourceCache.java index 0a4a66fec..3aac60dc1 100644 --- a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/MemoryResourceCache.java +++ b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/MemoryResourceCache.java @@ -29,8 +29,6 @@ import cn.stylefeng.roses.kernel.cache.memory.AbstractMemoryCacheOperator; import cn.stylefeng.roses.kernel.scanner.api.constants.ScannerConstants; import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition; -import java.util.Map; - /** * 基于内存的资源缓存 @@ -38,15 +36,15 @@ import java.util.Map; * @author fengshuonan * @date 2021/5/17 16:05 */ -public class MemoryResourceCache extends AbstractMemoryCacheOperator> { +public class MemoryResourceCache extends AbstractMemoryCacheOperator { /** - * TimedCache的key是appCode,value的key是资源url,value是ResourceDefinition + * TimedCache的key是资源url,value是ResourceDefinition * * @author fengshuonan * @date 2021/5/17 16:06 */ - public MemoryResourceCache(TimedCache> timedCache) { + public MemoryResourceCache(TimedCache timedCache) { super(timedCache); } diff --git a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/RedisResourceCache.java b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/RedisResourceCache.java index c6228485a..863cf67c0 100644 --- a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/RedisResourceCache.java +++ b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/cache/RedisResourceCache.java @@ -24,13 +24,11 @@ */ package cn.stylefeng.roses.kernel.system.modular.resource.cache; -import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisCacheOperator; +import cn.stylefeng.roses.kernel.cache.redis.AbstractRedisHashCacheOperator; import cn.stylefeng.roses.kernel.scanner.api.constants.ScannerConstants; import cn.stylefeng.roses.kernel.scanner.api.pojo.resource.ResourceDefinition; import org.springframework.data.redis.core.RedisTemplate; -import java.util.Map; - /** * 基于redis的资源缓存 @@ -38,18 +36,24 @@ import java.util.Map; * @author fengshuonan * @date 2021/5/17 16:05 */ -public class RedisResourceCache extends AbstractRedisCacheOperator> { +public class RedisResourceCache extends AbstractRedisHashCacheOperator { /** - * RedisTemplate的key是appCode,value的key是资源url,value是ResourceDefinition + * RedisTemplate的key是资源url,value是ResourceDefinition * * @author fengshuonan * @date 2021/5/17 16:06 */ - public RedisResourceCache(RedisTemplate> redisTemplate) { + public RedisResourceCache(RedisTemplate redisTemplate) { super(redisTemplate); } + /** + * hash结构的key + * + * @author fengshuonan + * @date 2021/5/17 17:34 + */ @Override public String getCommonKeyPrefix() { return ScannerConstants.RESOURCE_CACHE_KEY; diff --git a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java index 5818fe481..17e911532 100644 --- a/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java +++ b/kernel-s-system/system-business-resource/src/main/java/cn/stylefeng/roses/kernel/system/modular/resource/service/impl/SysResourceServiceImpl.java @@ -80,7 +80,7 @@ public class SysResourceServiceImpl extends ServiceImpl> resourceCache; + private CacheOperatorApi resourceCache; @Override public PageResult findPage(ResourceRequest resourceRequest) { @@ -267,7 +267,9 @@ public class SysResourceServiceImpl extends ServiceImpl resourceDefinitionMap = ResourceFactory.orderedResourceDefinition(resourceDefinitionArrayList); - resourceCache.put(projectCode, resourceDefinitionMap); + for (Map.Entry entry : resourceDefinitionMap.entrySet()) { + resourceCache.put(entry.getKey(), entry.getValue()); + } } @Override diff --git a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/system/starter/GunsResourceCacheAutoConfiguration.java b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/system/starter/GunsResourceCacheAutoConfiguration.java index 0d2a79e97..57acce278 100644 --- a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/system/starter/GunsResourceCacheAutoConfiguration.java +++ b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/system/starter/GunsResourceCacheAutoConfiguration.java @@ -34,8 +34,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.Map; - /** * 资源缓存自动配置 * @@ -53,8 +51,8 @@ public class GunsResourceCacheAutoConfiguration { */ @Bean @ConditionalOnMissingBean(name = "resourceCache") - public CacheOperatorApi> resourceCache() { - TimedCache> timedCache = CacheUtil.newTimedCache(CacheConstants.NONE_EXPIRED_TIME); + public CacheOperatorApi resourceCache() { + TimedCache timedCache = CacheUtil.newTimedCache(CacheConstants.NONE_EXPIRED_TIME); return new MemoryResourceCache(timedCache); }