Innovabit.DotNet.Interceptors.RateLimiting.Redis
2.0.116
dotnet add package Innovabit.DotNet.Interceptors.RateLimiting.Redis --version 2.0.116
NuGet\Install-Package Innovabit.DotNet.Interceptors.RateLimiting.Redis -Version 2.0.116
<PackageReference Include="Innovabit.DotNet.Interceptors.RateLimiting.Redis" Version="2.0.116" />
<PackageVersion Include="Innovabit.DotNet.Interceptors.RateLimiting.Redis" Version="2.0.116" />
<PackageReference Include="Innovabit.DotNet.Interceptors.RateLimiting.Redis" />
paket add Innovabit.DotNet.Interceptors.RateLimiting.Redis --version 2.0.116
#r "nuget: Innovabit.DotNet.Interceptors.RateLimiting.Redis, 2.0.116"
#:package Innovabit.DotNet.Interceptors.RateLimiting.Redis@2.0.116
#addin nuget:?package=Innovabit.DotNet.Interceptors.RateLimiting.Redis&version=2.0.116
#tool nuget:?package=Innovabit.DotNet.Interceptors.RateLimiting.Redis&version=2.0.116
Innovabit.DotNet.Interceptors.RateLimiting.Redis
Redis store for
Innovabit.DotNet.Interceptors.RateLimiting.Abstractions:
the allowance is shared, so [RateLimit(PermitLimit = 100)] means a hundred calls across your whole
service, not a hundred per instance.
Usage
services.AddSingleton<IConnectionMultiplexer>(_ => ConnectionMultiplexer.Connect("localhost:6379"));
services
.AddInterceptors()
.AddRedisRateLimiter(); // or .AddRedisRateLimiter("localhost:6379")
services.AddInterceptors().AddRedisRateLimiter(o =>
{
o.KeyPrefix = "contoso:rl:"; // keep two applications on one Redis out of each other's counters
o.FailOpen = false; // refuse rather than let calls through when Redis is unreachable
});
How it counts
A fixed window: one counter per partition per window, with the window's start baked into the key.
INCR and the expiry happen in a single Lua script, so they are one round trip and one atomic step
— two calls would leave a key without a TTL whenever the process died in between, and that allowance
would never reset. A new window starts with a fresh key and the old one expires on its own, so there
is no reset step and nothing to clean up.
A fixed window is the cheapest correct-enough choice. Its known edge is the boundary: a caller can spend the whole allowance at the end of one window and again at the start of the next, so twice the limit can pass within a window's length. A sliding-log or token-bucket limiter avoids that at the cost of storing every timestamp; if the boundary matters more than the cost, write a store that does.
When Redis is unreachable
By default the call goes through. A rate limiter exists to protect you from too much traffic, and taking the service down entirely because the limiter is unavailable trades a degraded service for no service at all.
Set FailOpen = false when the limit is a contractual quota rather than self-protection, and
exceeding it is worse than refusing the call.
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Innovabit.DotNet.Interceptors.RateLimiting.Abstractions (>= 2.0.116)
- StackExchange.Redis (>= 3.4.20)
-
net8.0
- Innovabit.DotNet.Interceptors.RateLimiting.Abstractions (>= 2.0.116)
- StackExchange.Redis (>= 3.4.20)
-
net9.0
- Innovabit.DotNet.Interceptors.RateLimiting.Abstractions (>= 2.0.116)
- StackExchange.Redis (>= 3.4.20)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.0.116 | 44 | 10/26/2026 |
| 2.0.115 | 99 | 10/17/2026 |
| 2.0.114 | 94 | 10/10/2026 |
| 2.0.113 | 107 | 10/3/2026 |
| 2.0.112 | 104 | 9/28/2026 |
| 2.0.111 | 100 | 9/28/2026 |
| 2.0.110 | 100 | 9/27/2026 |
| 2.0.109 | 94 | 9/26/2026 |
| 2.0.108 | 99 | 9/26/2026 |
| 2.0.107 | 106 | 9/26/2026 |
| 2.0.106 | 108 | 9/25/2026 |
| 2.0.105 | 100 | 9/25/2026 |
| 1.0.0.104 | 96 | 9/25/2026 |
| 1.0.0.103 | 96 | 9/25/2026 |