feat: Refactor Redis rate limiter to use interface for improved testability and remove mock client replacement pattern

- Add RedisClientInterface with Eval/Del/ZCount methods for Redis operation abstraction
- Update RedisRateLimiter/NewRedisRateLimiter/NewMultiTierRateLimiter to accept RedisClientInterface instead of concrete redis.Client
- Update MockRedisClient.Eval to properly construct call arguments with script and keys
- Update MockRedisClient.Del to accept keys as slice instead of variadic parameters
This commit is contained in:
nutcas3
2026-04-23 03:16:00 +03:00
parent 857ca98382
commit 8909126612
2 changed files with 35 additions and 37 deletions
@@ -11,9 +11,16 @@ import (
"github.com/go-redis/redis/v8"
)
// RedisClientInterface defines the interface for Redis operations
type RedisClientInterface interface {
Eval(ctx context.Context, script string, keys []string, args ...interface{}) *redis.Cmd
Del(ctx context.Context, keys ...string) *redis.IntCmd
ZCount(ctx context.Context, key, min, max string) *redis.IntCmd
}
// RedisRateLimiter implements distributed rate limiting using Redis
type RedisRateLimiter struct {
client *redis.Client
client RedisClientInterface
prefix string
limit int64
window time.Duration
@@ -29,7 +36,7 @@ type RateLimitResult struct {
}
// NewRedisRateLimiter creates a new Redis-based rate limiter
func NewRedisRateLimiter(client *redis.Client, prefix string, limit int64, window time.Duration) *RedisRateLimiter {
func NewRedisRateLimiter(client RedisClientInterface, prefix string, limit int64, window time.Duration) *RedisRateLimiter {
return &RedisRateLimiter{
client: client,
prefix: prefix,
@@ -337,7 +344,7 @@ type MultiTierRateLimiter struct {
}
// NewMultiTierRateLimiter creates a multi-tier rate limiter
func NewMultiTierRateLimiter(client *redis.Client, tiers map[string]struct {
func NewMultiTierRateLimiter(client RedisClientInterface, tiers map[string]struct {
Limit int64
Window time.Duration
Prefix string