package com.qianwen.core.redis.ratelimiter;
|
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.concurrent.TimeUnit;
|
import org.springframework.core.env.Environment;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.script.RedisScript;
|
|
/* loaded from: blade-starter-redis-9.3.0.0-SNAPSHOT.jar:org/springblade/core/redis/ratelimiter/RedisRateLimiterClient.class */
|
public class RedisRateLimiterClient implements RateLimiterClient {
|
private static final String REDIS_KEY_PREFIX = "limiter:";
|
private static final long FAIL_CODE = 0;
|
private final StringRedisTemplate redisTemplate;
|
private final RedisScript<List<Long>> script;
|
private final Environment environment;
|
|
public RedisRateLimiterClient(final StringRedisTemplate redisTemplate, final RedisScript<List<Long>> script, final Environment environment) {
|
this.redisTemplate = redisTemplate;
|
this.script = script;
|
this.environment = environment;
|
}
|
|
@Override // org.springblade.core.redis.ratelimiter.RateLimiterClient
|
public boolean isAllowed(String key, long max, long ttl, TimeUnit timeUnit) {
|
String redisKeyBuilder = REDIS_KEY_PREFIX + getApplicationName(this.environment) + ':' + key;
|
List<String> keys = Collections.singletonList(redisKeyBuilder);
|
long now = System.currentTimeMillis();
|
long ttlMillis = timeUnit.toMillis(ttl);
|
List<Long> results = (List) this.redisTemplate.execute(this.script, keys, new Object[]{max + "", ttlMillis + "", now + ""});
|
if (results == null || results.isEmpty()) {
|
return false;
|
}
|
Long result = results.get(0);
|
return result.longValue() != FAIL_CODE;
|
}
|
|
private static String getApplicationName(Environment environment) {
|
return environment.getProperty("spring.application.name", "");
|
}
|
}
|