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