private void waitForToken(String tenantId) throws InterruptedException {
String key = RATE_LIMIT_KEY_PREFIX + tenantId;
long maxTokens = 5; // 最大令牌数
long refillInterval = 1000; // 令牌补充间隔(ms)
while (true) {
// 使用 Lua 脚本保证原子性
String luaScript =
"local current_tokens = redis.call('GET', KEYS[1])\n" +
"local last_refill_time = redis.call('GET', KEYS[2])\n" +
"local now = tonumber(ARGV[1])\n" +
"local max_tokens = tonumber(ARGV[2])\n" +
"local refill_interval = tonumber(ARGV[3])\n" +
"\n" +
"if current_tokens == false then\n" +
" redis.call('SET', KEYS[1], max_tokens - 1)\n" +
" redis.call('SET', KEYS[2], now)\n" +
" return 1\n" +
"end\n" +
"\n" +
"current_tokens = tonumber(current_tokens