疯狂的狮子li
2021-11-01 c4e17ff8472fd9f8123e86b593b2968ad5936b15
ruoyi-framework/src/main/java/com/ruoyi/framework/config/RedisConfig.java
@@ -1,7 +1,6 @@
package com.ruoyi.framework.config;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.config.properties.RedissonProperties;
import lombok.extern.slf4j.Slf4j;
@@ -19,7 +18,6 @@
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import java.io.IOException;
import java.util.HashMap;
@@ -78,7 +76,7 @@
               .setConnectionPoolSize(singleServerConfig.getConnectionPoolSize())
               .setDnsMonitoringInterval(singleServerConfig.getDnsMonitoringInterval());
      }
      // 集群配置方式 参考下方注释
      RedissonProperties.ClusterServersConfig clusterServersConfig = redissonProperties.getClusterServersConfig();
      if (ObjectUtil.isNotNull(clusterServersConfig)) {
         // 使用集群模式
@@ -125,32 +123,69 @@
      return new RedissonSpringCacheManager(redissonClient, config, JsonJacksonCodec.INSTANCE);
   }
   @Bean
   public DefaultRedisScript<Long> limitScript() {
      DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
      redisScript.setScriptText(limitScriptText());
      redisScript.setResultType(Long.class);
      return redisScript;
   }
   /**
    * 限流脚本
    * redis集群配置 yml
    *
    * --- # redis 集群配置(单机与集群只能开启一个另一个需要注释掉)
    * spring:
    *   redis:
    *     cluster:
    *       nodes:
    *         - 192.168.0.100:6379
    *         - 192.168.0.101:6379
    *         - 192.168.0.102:6379
    *     # 密码
    *     password:
    *     # 连接超时时间
    *     timeout: 10s
    *     # 是否开启ssl
    *     ssl: false
    *
    * redisson:
    *   # 线程池数量
    *   threads: 16
    *   # Netty线程池数量
    *   nettyThreads: 32
    *   # 传输模式
    *   transportMode: "NIO"
    *   # 集群配置
    *   clusterServersConfig:
    *     # 客户端名称
    *     clientName: ${ruoyi.name}
    *     # master最小空闲连接数
    *     masterConnectionMinimumIdleSize: 32
    *     # master连接池大小
    *     masterConnectionPoolSize: 64
    *     # slave最小空闲连接数
    *     slaveConnectionMinimumIdleSize: 32
    *     # slave连接池大小
    *     slaveConnectionPoolSize: 64
    *     # 连接空闲超时,单位:毫秒
    *     idleConnectionTimeout: 10000
    *     # ping连接间隔
    *     pingConnectionInterval: 1000
    *     # 命令等待超时,单位:毫秒
    *     timeout: 3000
    *     # 如果尝试在此限制之内发送成功,则开始启用 timeout 计时。
    *     retryAttempts: 3
    *     # 命令重试发送时间间隔,单位:毫秒
    *     retryInterval: 1500
    *     # 从可用服务器的内部列表中排除 Redis Slave 重新连接尝试的间隔。
    *     failedSlaveReconnectionInterval: 3000
    *     # 发布和订阅连接池最小空闲连接数
    *     subscriptionConnectionMinimumIdleSize: 1
    *     # 发布和订阅连接池大小
    *     subscriptionConnectionPoolSize: 50
    *     # 单个连接最大订阅数量
    *     subscriptionsPerConnection: 5
    *     # 扫描间隔
    *     scanInterval: 1000
    *     # DNS监测时间间隔,单位:毫秒
    *     dnsMonitoringInterval: 5000
    *     # 读取模式
    *     readMode: "SLAVE"
    *     # 订阅模式
    *     subscriptionMode: "MASTER"
    */
   private String limitScriptText() {
      return StrUtil.builder()
         .append("local key = KEYS[1]\n")
         .append("local count = tonumber(ARGV[1])\n")
         .append("local time = tonumber(ARGV[2])\n")
         .append("local current = redis.call('get', key);\n")
         .append("if current and tonumber(current) > count then\n")
         .append("    return current;\n")
         .append("end\n")
         .append("current = redis.call('incr', key)\n")
         .append("if tonumber(current) == 1 then\n")
         .append("    redis.call('expire', key, time)\n")
         .append("end\n")
         .append("return current;")
         .toString();
   }
}