yangys
2024-03-27 e48aa2ac8dea1be5db11c63edf0b912c4ad5ce65
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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", "");
    }
}