lib/congestion/rate_limiter.rb in congestion-0.0.3 vs lib/congestion/rate_limiter.rb in congestion-0.1.0

- old
+ new

@@ -82,23 +82,34 @@ (millis / 1_000.0).ceil end def add_request unless options[:track_rejected] - redis.zadd key, current_time, current_time + add_request = redis.multi do |t| + t.zadd key, current_time, current_time # [0] - key added + t.ttl key # [1] - key ttl + end + # TTL is -1 if not set, https://redis.io/commands/ttl + if add_request[1] == -1 + # ensure we set the expire TTL on the request key + # using the raw interval here after the 'get_requests' limit check + # should be close enough to the actual interval folks desire + redis.pexpire key, options[:interval] + end end end def get_requests @requests ||= redis.multi do |t| - t.zremrangebyscore key, 0, expired_at # [0] - clear old requests - t.zcount key, '-inf', '+inf' # [1] - number of requests - t.zrange key, 0, 0 # [2] - first request - t.zrange key, -1, -1 # [3] - last request - t.pexpire key, options[:interval] # [4] - expire request key - - # [5] - Add the request if tracking rejected - t.zadd(key, current_time, current_time) if options[:track_rejected] + t.zremrangebyscore key, 0, expired_at # [0] - clear old requests + t.zcount key, '-inf', '+inf' # [1] - number of requests + t.zrange key, 0, 0 # [2] - first request + t.zrange key, -1, -1 # [3] - last request + if options[:track_rejected] + t.zadd(key, current_time, current_time) # [4] - Add the request if tracking rejected + end + # ensure the TTL is set after we've added the key if tracking rejected + t.pexpire key, options[:interval] # [5] - expire request key end end end end