Class: Throttle::RedisScript

Inherits:
Object
  • Object
show all
Defined in:
lib/throttle/redis_script.rb

Constant Summary collapse

SCRIPT =
File.read("lib/throttle.lua").freeze
SCRIPT_SHA1 =
Digest::SHA1.hexdigest(SCRIPT)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(redis, key, default_bucket_size) ⇒ RedisScript

Returns a new instance of RedisScript.



12
13
14
15
16
# File 'lib/throttle/redis_script.rb', line 12

def initialize(redis, key, default_bucket_size)
  @redis = redis
  @key   = key
  @default_bucket_size = default_bucket_size
end

Class Method Details

.key(key, type) ⇒ Object



8
9
10
# File 'lib/throttle/redis_script.rb', line 8

def self.key(key, type)
  "#{@key}:#{type}"
end

Instance Method Details

#acquireObject



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/throttle/redis_script.rb', line 18

def acquire
  begin
    keys = [key(:size), key(:time), key(:count), key(:duration)]
    go, count, time = @redis.evalsha(SCRIPT_SHA1, keys, [Time.now.utc.to_i])
    [go == 1, count, time]
  rescue Redis::CommandError => e
    raise unless e.message =~ /NOSCRIPT/

    @redis.send("script", "load", SCRIPT)
    acquire
  end
end

#set_bucket_size!(val = nil) ⇒ Object



36
37
38
# File 'lib/throttle/redis_script.rb', line 36

def set_bucket_size!(val = nil)
  @redis.set(key(:size), val || @default_bucket_size)
end

#statusObject



31
32
33
34
# File 'lib/throttle/redis_script.rb', line 31

def status
  time, count, size = @redis.mget(key(:time), key(:count), key(:size))
  [Time.at(time.to_i), count.to_i, size.to_i]
end