Skip to content

Commit 04cad09

Browse files
RedisTokenBucketRateLimiter now supports permitCount parameter
1 parent 0b50d5f commit 04cad09

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

src/RedisRateLimiting/TokenBucket/RedisTokenBucketManager.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public RedisTokenBucketManager(
5656
RateLimitTimestampKey = new RedisKey($"rl:{{{partitionKey}}}:ts");
5757
}
5858

59-
internal async Task<RedisTokenBucketResponse> TryAcquireLeaseAsync()
59+
internal async Task<RedisTokenBucketResponse> TryAcquireLeaseAsync(int permitCount)
6060
{
6161
var now = DateTimeOffset.UtcNow;
6262
var nowUnixTimeSeconds = now.ToUnixTimeSeconds();
@@ -73,7 +73,7 @@ internal async Task<RedisTokenBucketResponse> TryAcquireLeaseAsync()
7373
tokens_per_period = _options.TokensPerPeriod,
7474
token_limit = _options.TokenLimit,
7575
replenish_period = _options.ReplenishmentPeriod.TotalSeconds,
76-
permit_count = 1D,
76+
permit_count = permitCount,
7777
});
7878

7979
var result = new RedisTokenBucketResponse();
@@ -87,7 +87,7 @@ internal async Task<RedisTokenBucketResponse> TryAcquireLeaseAsync()
8787
return result;
8888
}
8989

90-
internal RedisTokenBucketResponse TryAcquireLease()
90+
internal RedisTokenBucketResponse TryAcquireLease(int permitCount)
9191
{
9292
var now = DateTimeOffset.UtcNow;
9393
var nowUnixTimeSeconds = now.ToUnixTimeSeconds();
@@ -104,7 +104,7 @@ internal RedisTokenBucketResponse TryAcquireLease()
104104
tokens_per_period = _options.TokensPerPeriod,
105105
token_limit = _options.TokenLimit,
106106
replenish_period = _options.ReplenishmentPeriod.TotalSeconds,
107-
permit_count = 1D,
107+
permit_count = permitCount,
108108
});
109109

110110
var result = new RedisTokenBucketResponse();

src/RedisRateLimiting/TokenBucket/RedisTokenBucketRateLimiter.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ protected override ValueTask<RateLimitLease> AcquireAsyncCore(int permitCount, C
6060
throw new ArgumentOutOfRangeException(nameof(permitCount), permitCount, string.Format("{0} permit(s) exceeds the permit limit of {1}.", permitCount, _options.TokenLimit));
6161
}
6262

63-
return AcquireAsyncCoreInternal();
63+
return AcquireAsyncCoreInternal(permitCount);
6464
}
6565

6666
protected override RateLimitLease AttemptAcquireCore(int permitCount)
@@ -75,7 +75,7 @@ protected override RateLimitLease AttemptAcquireCore(int permitCount)
7575
Limit = _options.TokenLimit,
7676
};
7777

78-
var response = _redisManager.TryAcquireLease();
78+
var response = _redisManager.TryAcquireLease(permitCount);
7979

8080
leaseContext.Allowed = response.Allowed;
8181
leaseContext.Count = response.Count;
@@ -88,14 +88,14 @@ protected override RateLimitLease AttemptAcquireCore(int permitCount)
8888
return new TokenBucketLease(isAcquired: false, leaseContext);
8989
}
9090

91-
private async ValueTask<RateLimitLease> AcquireAsyncCoreInternal()
91+
private async ValueTask<RateLimitLease> AcquireAsyncCoreInternal(int permitCount)
9292
{
9393
var leaseContext = new TokenBucketLeaseContext
9494
{
9595
Limit = _options.TokenLimit,
9696
};
9797

98-
var response = await _redisManager.TryAcquireLeaseAsync();
98+
var response = await _redisManager.TryAcquireLeaseAsync(permitCount);
9999

100100
leaseContext.Allowed = response.Allowed;
101101
leaseContext.Count = response.Count;

test/RedisRateLimiting.Tests/UnitTests/TokenBucketUnitTests.cs

+23
Original file line numberDiff line numberDiff line change
@@ -107,5 +107,28 @@ public async Task CanAcquireAsyncResource()
107107
using var lease2 = await limiter.AcquireAsync();
108108
Assert.False(lease2.IsAcquired);
109109
}
110+
111+
[Fact]
112+
public async Task SupportsPermitCountFlag()
113+
{
114+
using var limiter = new RedisTokenBucketRateLimiter<string>(
115+
"Test_SupportsPermitCountFlag_TB",
116+
new RedisTokenBucketRateLimiterOptions
117+
{
118+
TokenLimit = 5,
119+
TokensPerPeriod = 5,
120+
ReplenishmentPeriod = TimeSpan.FromMinutes(1),
121+
ConnectionMultiplexerFactory = Fixture.ConnectionMultiplexerFactory,
122+
});
123+
124+
using var lease = await limiter.AcquireAsync(4);
125+
Assert.True(lease.IsAcquired);
126+
127+
using var lease2 = await limiter.AcquireAsync(3);
128+
Assert.False(lease2.IsAcquired);
129+
130+
using var lease3 = await limiter.AcquireAsync(1);
131+
Assert.True(lease3.IsAcquired);
132+
}
110133
}
111134
}

0 commit comments

Comments
 (0)