!562 优化 redisCache
Merge pull request !562 from wanwan/feature/redis_cache_optimize_20230810
This commit is contained in:
commit
8960a82978
|
@ -4,6 +4,7 @@ import cn.hutool.core.annotation.AnnotationUtil;
|
|||
import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
||||
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
|
||||
import cn.iocoder.yudao.framework.redis.config.YudaoCacheProperties;
|
||||
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnoreAspect;
|
||||
import cn.iocoder.yudao.framework.tenant.core.db.TenantDatabaseInterceptor;
|
||||
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
|
||||
|
@ -27,6 +28,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
|
|||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.data.redis.cache.BatchStrategies;
|
||||
import org.springframework.data.redis.cache.RedisCacheConfiguration;
|
||||
import org.springframework.data.redis.cache.RedisCacheManager;
|
||||
import org.springframework.data.redis.cache.RedisCacheWriter;
|
||||
|
@ -124,10 +126,12 @@ public class YudaoTenantAutoConfiguration {
|
|||
@Bean
|
||||
@Primary // 引入租户时,tenantRedisCacheManager 为主 Bean
|
||||
public RedisCacheManager tenantRedisCacheManager(RedisTemplate<String, Object> redisTemplate,
|
||||
RedisCacheConfiguration redisCacheConfiguration) {
|
||||
RedisCacheConfiguration redisCacheConfiguration,
|
||||
YudaoCacheProperties yudaoCacheProperties) {
|
||||
// 创建 RedisCacheWriter 对象
|
||||
RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory());
|
||||
RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
|
||||
RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory,
|
||||
BatchStrategies.scan(yudaoCacheProperties.getRedisScanBatchSize()));
|
||||
// 创建 TenantRedisCacheManager 对象
|
||||
return new TenantRedisCacheManager(cacheWriter, redisCacheConfiguration);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
|
|||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Primary;
|
||||
import org.springframework.data.redis.cache.BatchStrategies;
|
||||
import org.springframework.data.redis.cache.RedisCacheConfiguration;
|
||||
import org.springframework.data.redis.cache.RedisCacheManager;
|
||||
import org.springframework.data.redis.cache.RedisCacheWriter;
|
||||
|
@ -23,7 +24,7 @@ import static cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguratio
|
|||
* Cache 配置类,基于 Redis 实现
|
||||
*/
|
||||
@AutoConfiguration
|
||||
@EnableConfigurationProperties({CacheProperties.class})
|
||||
@EnableConfigurationProperties({CacheProperties.class, YudaoCacheProperties.class})
|
||||
@EnableCaching
|
||||
public class YudaoCacheAutoConfiguration {
|
||||
|
||||
|
@ -62,10 +63,12 @@ public class YudaoCacheAutoConfiguration {
|
|||
|
||||
@Bean
|
||||
public RedisCacheManager redisCacheManager(RedisTemplate<String, Object> redisTemplate,
|
||||
RedisCacheConfiguration redisCacheConfiguration) {
|
||||
RedisCacheConfiguration redisCacheConfiguration,
|
||||
YudaoCacheProperties yudaoCacheProperties) {
|
||||
// 创建 RedisCacheWriter 对象
|
||||
RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory());
|
||||
RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
|
||||
RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory,
|
||||
BatchStrategies.scan(yudaoCacheProperties.getRedisScanBatchSize()));
|
||||
// 创建 TenantRedisCacheManager 对象
|
||||
return new TimeoutRedisCacheManager(cacheWriter, redisCacheConfiguration);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package cn.iocoder.yudao.framework.redis.config;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
/**
|
||||
* Cache 配置项
|
||||
*
|
||||
* @author
|
||||
*/
|
||||
@ConfigurationProperties("yudao.cache")
|
||||
@Data
|
||||
@Validated
|
||||
public class YudaoCacheProperties {
|
||||
|
||||
/**
|
||||
* redis scan 一次返回数量
|
||||
*/
|
||||
private Integer redisScanBatchSize = 30;
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package cn.iocoder.yudao.framework.redis.core;
|
||||
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import org.springframework.boot.convert.DurationStyle;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
@ -13,8 +14,8 @@ import java.time.temporal.ChronoUnit;
|
|||
|
||||
/**
|
||||
* 支持自定义过期时间的 {@link RedisCacheManager} 实现类
|
||||
*
|
||||
* 在 {@link Cacheable#cacheNames()} 格式为 "key#ttl" 时,# 后面的 ttl 为过期时间,单位为秒
|
||||
* <p>
|
||||
* 在 {@link Cacheable#cacheNames()} 格式为 "key#ttl" 时,# 后面的 ttl 为过期时间,单位为最后一个字母(支持的单位有:d天,h小时,m分钟,s秒),默认单位为秒
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
|
@ -42,10 +43,41 @@ public class TimeoutRedisCacheManager extends RedisCacheManager {
|
|||
// 移除 # 后面的 : 以及后面的内容,避免影响解析
|
||||
names[1] = StrUtil.subBefore(names[1], StrUtil.COLON, false);
|
||||
// 解析时间
|
||||
Duration duration = DurationStyle.detectAndParse(names[1], ChronoUnit.SECONDS);
|
||||
Duration duration = parseDuration(names[1]);
|
||||
cacheConfig = cacheConfig.entryTtl(duration);
|
||||
}
|
||||
return super.createRedisCache(names[0], cacheConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析 Duration
|
||||
*
|
||||
* @param ttlStr
|
||||
* @return
|
||||
*/
|
||||
private Duration parseDuration(String ttlStr) {
|
||||
String timeUnit = StrUtil.subSuf(ttlStr, -1);
|
||||
switch (timeUnit) {
|
||||
case "d":
|
||||
return Duration.ofDays(removeSuffix(ttlStr));
|
||||
case "h":
|
||||
return Duration.ofHours(removeSuffix(ttlStr));
|
||||
case "m":
|
||||
return Duration.ofMinutes(removeSuffix(ttlStr));
|
||||
case "s":
|
||||
return Duration.ofSeconds(removeSuffix(ttlStr));
|
||||
default:
|
||||
return Duration.ofSeconds(Long.parseLong(ttlStr));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 移除多余的后缀
|
||||
*
|
||||
* @param ttlStr
|
||||
* @return
|
||||
*/
|
||||
private Long removeSuffix(String ttlStr) {
|
||||
return NumberUtil.parseLong(StrUtil.sub(ttlStr, 0, ttlStr.length() - 1));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -204,6 +204,8 @@ yudao:
|
|||
order:
|
||||
app-id: 1 # 商户编号
|
||||
expire-time: 2h # 支付的过期时间
|
||||
cache: # spring cache 相关配置
|
||||
redis-scan-batch-size: 30 # redis scan 一次返回数量
|
||||
|
||||
debug: false
|
||||
|
||||
|
|
Loading…
Reference in New Issue