【7.0.4】适配hash结构的缓存操作,整理资源扫描缓存类

pull/16/MERGE
fengshuonan 2021-05-17 18:04:31 +08:00
parent dedc085efb
commit a7a8aa8d2d
6 changed files with 144 additions and 18 deletions

View File

@ -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.
*
* GunsAPACHE 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;
/**
* redishash
*
* @author stylefeng
* @date 2020/7/9 10:09
*/
@SuppressWarnings("all")
public abstract class AbstractRedisHashCacheOperator<T> implements CacheOperatorApi<T> {
private final RedisTemplate<String, T> redisTemplate;
public AbstractRedisHashCacheOperator(RedisTemplate<String, T> 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<String> getAllKeys() {
Set<Object> 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<T> getAllValues() {
Collection<String> allKeys = getAllKeys();
if (allKeys != null) {
return (Collection<T>) redisTemplate.boundHashOps(getCommonKeyPrefix()).multiGet(Collections.singleton(allKeys));
} else {
return CollectionUtil.newArrayList();
}
}
@Override
public Map<String, T> getAllKeyValues() {
Collection<String> allKeys = this.getAllKeys();
HashMap<String, T> 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<String, T> getRedisTemplate() {
return this.redisTemplate;
}
}

View File

@ -45,7 +45,7 @@ public interface ScannerConstants {
/**
*
*/
String RESOURCE_CACHE_KEY = "GUNS_RESOURCE_CACHES:";
String RESOURCE_CACHE_KEY = "GUNS_RESOURCE_CACHES";
/**
*

View File

@ -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<Map<String, ResourceDefinition>> {
public class MemoryResourceCache extends AbstractMemoryCacheOperator<ResourceDefinition> {
/**
* TimedCachekeyappCodevaluekeyurlvalueResourceDefinition
* TimedCachekeyurlvalueResourceDefinition
*
* @author fengshuonan
* @date 2021/5/17 16:06
*/
public MemoryResourceCache(TimedCache<String, Map<String, ResourceDefinition>> timedCache) {
public MemoryResourceCache(TimedCache<String, ResourceDefinition> timedCache) {
super(timedCache);
}

View File

@ -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<Map<String, ResourceDefinition>> {
public class RedisResourceCache extends AbstractRedisHashCacheOperator<ResourceDefinition> {
/**
* RedisTemplatekeyappCodevaluekeyurlvalueResourceDefinition
* RedisTemplatekeyurlvalueResourceDefinition
*
* @author fengshuonan
* @date 2021/5/17 16:06
*/
public RedisResourceCache(RedisTemplate<String, Map<String, ResourceDefinition>> redisTemplate) {
public RedisResourceCache(RedisTemplate<String, ResourceDefinition> redisTemplate) {
super(redisTemplate);
}
/**
* hashkey
*
* @author fengshuonan
* @date 2021/5/17 17:34
*/
@Override
public String getCommonKeyPrefix() {
return ScannerConstants.RESOURCE_CACHE_KEY;

View File

@ -80,7 +80,7 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
private RoleServiceApi roleServiceApi;
@Resource(name = "resourceCache")
private CacheOperatorApi<Map<String, ResourceDefinition>> resourceCache;
private CacheOperatorApi<ResourceDefinition> resourceCache;
@Override
public PageResult<SysResource> findPage(ResourceRequest resourceRequest) {
@ -267,7 +267,9 @@ public class SysResourceServiceImpl extends ServiceImpl<SysResourceMapper, SysRe
//将资源存入缓存一份
Map<String, ResourceDefinition> resourceDefinitionMap = ResourceFactory.orderedResourceDefinition(resourceDefinitionArrayList);
resourceCache.put(projectCode, resourceDefinitionMap);
for (Map.Entry<String, ResourceDefinition> entry : resourceDefinitionMap.entrySet()) {
resourceCache.put(entry.getKey(), entry.getValue());
}
}
@Override

View File

@ -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<Map<String, ResourceDefinition>> resourceCache() {
TimedCache<String, Map<String, ResourceDefinition>> timedCache = CacheUtil.newTimedCache(CacheConstants.NONE_EXPIRED_TIME);
public CacheOperatorApi<ResourceDefinition> resourceCache() {
TimedCache<String, ResourceDefinition> timedCache = CacheUtil.newTimedCache(CacheConstants.NONE_EXPIRED_TIME);
return new MemoryResourceCache(timedCache);
}