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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Innovabit.DotNet.Interceptors.RateLimiting.Redis" Version="2.0.116" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Innovabit.DotNet.Interceptors.RateLimiting.Redis" Version="2.0.116" />
                    
Directory.Packages.props
<PackageReference Include="Innovabit.DotNet.Interceptors.RateLimiting.Redis" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Innovabit.DotNet.Interceptors.RateLimiting.Redis --version 2.0.116
                    
#r "nuget: Innovabit.DotNet.Interceptors.RateLimiting.Redis, 2.0.116"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Innovabit.DotNet.Interceptors.RateLimiting.Redis@2.0.116
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Innovabit.DotNet.Interceptors.RateLimiting.Redis&version=2.0.116
                    
Install as a Cake Addin
#tool nuget:?package=Innovabit.DotNet.Interceptors.RateLimiting.Redis&version=2.0.116
                    
Install as a Cake Tool

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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