class RedisLocks::TokenBucket

Constants

DIGEST
NAMESPACE
SCRIPT

Public Class Methods

new(key, period: 1, number: 1, redis: RedisLocks.redis) click to toggle source

‘number` tokens are added to the bucket every `period` seconds (up to a max of `number` tokens being available). Each time a resource is used, a token is removed from the bucket; if no tokens are available, no resource may be used.

# File lib/redis_locks/token_bucket.rb, line 44
def initialize(key, period: 1, number: 1, redis: RedisLocks.redis)
  @key = "#{NAMESPACE}:#{key}".freeze
  @rps = number.to_f / period.to_i
  @burst = number.to_i
  @redis = Connections.ensure_pool(redis)
end

Public Instance Methods

take() click to toggle source
# File lib/redis_locks/token_bucket.rb, line 51
def take
  took = @redis.with do |conn|
    RedisLocks.evalsha_or_eval(
      conn: conn,
      script: SCRIPT,
      digest: DIGEST,
      keys: [@key],
      args: [epoch_f(conn), @rps, @burst]
    )
  end

  took == 1
end
take!() click to toggle source
# File lib/redis_locks/token_bucket.rb, line 65
def take!
  raise RateLimitExceeded.new(@key, @rps) unless take
end

Private Instance Methods

epoch_f(conn) click to toggle source
# File lib/redis_locks/token_bucket.rb, line 71
def epoch_f(conn)
  epoch_i, microseconds = conn.time
  epoch_i + (microseconds.to_f/1_000_000)
end