35 lines
1.4 KiB
Go
35 lines
1.4 KiB
Go
package throttled
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// GCRAStore is the interface to implement to store state for a GCRA
|
|
// rate limiter
|
|
type GCRAStore interface {
|
|
// GetWithTime returns the value of the key if it is in the store
|
|
// or -1 if it does not exist. It also returns the current time at
|
|
// the Store. The time must be representable as a positive int64
|
|
// of nanoseconds since the epoch.
|
|
//
|
|
// GCRA assumes that all instances sharing the same Store also
|
|
// share the same clock. Using separate clocks will work if the
|
|
// skew is small but not recommended in practice unless you're
|
|
// lucky enough to be hooked up to GPS or atomic clocks.
|
|
GetWithTime(key string) (int64, time.Time, error)
|
|
|
|
// SetIfNotExistsWithTTL sets the value of key only if it is not
|
|
// already set in the store it returns whether a new value was
|
|
// set. If the store supports expiring keys and a new value was
|
|
// set, the key will expire after the provided ttl.
|
|
SetIfNotExistsWithTTL(key string, value int64, ttl time.Duration) (bool, error)
|
|
|
|
// CompareAndSwapWithTTL atomically compares the value at key to
|
|
// the old value. If it matches, it sets it to the new value and
|
|
// returns true. Otherwise, it returns false. If the key does not
|
|
// exist in the store, it returns false with no error. If the
|
|
// store supports expiring keys and the swap succeeded, the key
|
|
// will expire after the provided ttl.
|
|
CompareAndSwapWithTTL(key string, old, new int64, ttl time.Duration) (bool, error)
|
|
}
|