Documentation ¶
Index ¶
- Variables
- func WithConcurrencyPrefix(concurrentPrefix string) func(*Limiter)
- func WithRatePrefix(ratePrefix string) func(*Limiter)
- type ConcurrencyLimit
- type ConcurrencyResult
- type Limit
- type Limiter
- func (l *Limiter) Allow(ctx context.Context, key string, limit Limit) (*Result, error)
- func (l *Limiter) AllowAtMost(ctx context.Context, key string, limit Limit, n int) (*Result, error)
- func (l *Limiter) AllowN(ctx context.Context, key string, limit Limit, n int) (*Result, error)
- func (l *Limiter) LoadScripts(ctx context.Context) error
- func (l *Limiter) Pipeline() Pipeline
- func (tk *Limiter) Release(ctx context.Context, key string, requestID string, limit ConcurrencyLimit) error
- func (l *Limiter) Reset(ctx context.Context, key string) error
- func (tk *Limiter) Take(ctx context.Context, key string, requestID string, limit ConcurrencyLimit) (ConcurrencyResult, error)
- type Pipeline
- type RedisClientConn
- type Result
Examples ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var ErrScriptFailed = errors.New("redis_rate: invalid result from SCRIPT EXISTS in pipeline")
View Source
var ErrTooManyRetries = errors.New("redis_rate: pipeline too many retries to load scripts")
Functions ¶
func WithConcurrencyPrefix ¶ added in v11.0.2
WithConcurrencyPrefix sets the prefix for concurrency limit keys. If unset the default is "concurrency:".
func WithRatePrefix ¶ added in v11.0.2
WithRatePrefix sets the prefix for rate limit keys when using the Limiter. If unset the default is "rate:".
Types ¶
type ConcurrencyLimit ¶ added in v11.0.2
type ConcurrencyResult ¶ added in v11.0.2
type ConcurrencyResult struct { // Name of the key used for this result. Key string // Request ID used for this result. RequestID string // Limit is the limit that was used to obtain this result. Limit ConcurrencyLimit // Allowed is the number of events that may happen at time now. Allowed bool // Used is the number of events that have already happened at time now. Used int64 // Remaining is the maximum number of requests that could be // permitted instantaneously for this key given the current // state. For example, if a rate limiter allows 10 requests per // second and has already received 6 requests for this key this // second, Remaining would be 4. Remaining int64 }
type Limiter ¶
type Limiter struct {
// contains filtered or unexported fields
}
Limiter controls how frequently events are allowed to happen.
func New ¶ added in v11.0.2
func New(rdb RedisClientConn, options ...func(*Limiter)) *Limiter
New returns a new Limiter.
Example ¶
ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", }) _ = rdb.FlushDB(ctx).Err() limiter := redis_rate.New(rdb) res, err := limiter.Allow(ctx, "project:123", redis_rate.PerSecond(10)) if err != nil { panic(err) } fmt.Println("allowed", res.Allowed, "remaining", res.Remaining)
Output: allowed 1 remaining 9
func (*Limiter) AllowAtMost ¶
func (l *Limiter) AllowAtMost( ctx context.Context, key string, limit Limit, n int, ) (*Result, error)
AllowAtMost reports whether at most n events may happen at time now. It returns number of allowed events that is less than or equal to n.
func (*Limiter) Take ¶ added in v11.0.2
func (tk *Limiter) Take(ctx context.Context, key string, requestID string, limit ConcurrencyLimit) (ConcurrencyResult, error)
type RedisClientConn ¶
type RedisClientConn interface { Pipeline() redis.Pipeliner Pipelined(ctx context.Context, fn func(redis.Pipeliner) error) ([]redis.Cmder, error) Eval(ctx context.Context, script string, keys []string, args ...interface{}) *redis.Cmd EvalSha(ctx context.Context, sha1 string, keys []string, args ...interface{}) *redis.Cmd ScriptExists(ctx context.Context, hashes ...string) *redis.BoolSliceCmd ScriptLoad(ctx context.Context, script string) *redis.StringCmd Del(ctx context.Context, keys ...string) *redis.IntCmd EvalRO(ctx context.Context, script string, keys []string, args ...interface{}) *redis.Cmd EvalShaRO(ctx context.Context, sha1 string, keys []string, args ...interface{}) *redis.Cmd }
type Result ¶
type Result struct { // Name of the key used for this result. Key string // Limit is the limit that was used to obtain this result. Limit Limit // Allowed is the number of events that may happen at time now. Allowed int64 // Used is the number of events that have already happened at time now. Used int64 // Remaining is the maximum number of requests that could be // permitted instantaneously for this key given the current // state. For example, if a rate limiter allows 10 requests per // second and has already received 6 requests for this key this // second, Remaining would be 4. Remaining int64 // RetryAfter is the time until the next request will be permitted. // It should be -1 unless the rate limit has been exceeded. RetryAfter time.Duration // ResetAfter is the time until the RateLimiter returns to its // initial state for a given key. For example, if a rate limiter // manages requests per second and received one request 200ms ago, // Reset would return 800ms. You can also think of this as the time // until Limit and Remaining will be equal. ResetAfter time.Duration }
Click to show internal directories.
Click to hide internal directories.