All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.founder.core.ratelimiter.TokenBucketRateLimiter Maven / Gradle / Ivy

The newest version!
package com.founder.core.ratelimiter;

import com.founder.core.model.LuaScript;
import com.founder.core.model.Result;
import com.founder.core.model.Rule;
import org.redisson.api.RScript;
import org.redisson.api.RedissonClient;
import org.redisson.client.codec.LongCodec;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component
public class TokenBucketRateLimiter implements RateLimiter {

    private final RScript rScript;

    public TokenBucketRateLimiter(RedissonClient client) {
        this.rScript = client.getScript(LongCodec.INSTANCE);
    }

    @Override
    public Result isAllowed(Rule rule) {
        List keys = getKeys(rule.getKey());
        String script = LuaScript.getTokenBucketRateLimiterScript();
        List results = rScript.eval(RScript.Mode.READ_WRITE, script, RScript.ReturnType.MULTI, keys, rule.getRate(), rule.getBucketCapacity(), rule.getRequestedTokens());
        boolean isAllowed = results.get(0) == 1L;
        long newTokens = results.get(1);

        return new Result(isAllowed, newTokens);
    }

    static List getKeys(String key) {
        String prefix = "request_rate_limiter.{" + key;
        String tokenKey = prefix + "}.tokens";
        String timestampKey = prefix + "}.timestamp";
        return Arrays.asList(tokenKey, timestampKey);
    }
}