redis_rate_limiter 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. data/lib/redis_rate_limiter.rb +25 -4
  2. metadata +33 -1
@@ -1,11 +1,24 @@
1
1
  require 'redis'
2
2
 
3
3
  class RedisRateLimiter
4
+
5
+ # @!attribute key
6
+ # @return [String] Name which uniquely identifies this rate limiter
7
+ # @!attribute redis
8
+ # @return [Redis] Redis client associated with this rate limiter
9
+ # @!attribute interval
10
+ # @return [Integer] Time span this rate limiter tracks in seconds
11
+ # @!attribute limit
12
+ # @return [Integer] Max count allowed by rate limiter in interval
4
13
  attr_accessor :key, :redis, :limit, :interval
5
14
 
6
- # options:
7
- # :interval - time span to track in seconds
8
- # :limit - max count allowed in interval
15
+ # Initializes a new RedisRateLimiter object
16
+ #
17
+ # @param [String] key A name to uniquely identify this rate limiter
18
+ # @param [Redis] redis Redis client associated with rate limiter
19
+ # @param options [Integer] :interval Time span to track in seconds
20
+ # @param options [Integer] :limit Max count allowed in interval
21
+ # @return [RedisRateLimiter] Instance of this rate limiter
9
22
  def initialize key, redis, options = {}
10
23
  @key = key
11
24
  @redis = redis
@@ -13,6 +26,10 @@ class RedisRateLimiter
13
26
  @interval = options[:interval] || 60
14
27
  end
15
28
 
29
+ # Add to subject's count
30
+ #
31
+ # @param [String] subject A name to uniquely identify subject
32
+ # @param [time] time UNIX timestamp of event
16
33
  def add subject, time = Time.now.to_i
17
34
  subject = "#{@key}:#{subject}"
18
35
  @redis.multi do
@@ -22,10 +39,14 @@ class RedisRateLimiter
22
39
  end
23
40
  end
24
41
 
42
+ # Check if subject has exceeded count
43
+ #
44
+ # @param [String] subject Name which uniquely identifies subject
45
+ # @return [Boolean] Returns true if subject has exceeded count
25
46
  def exceeded? subject
26
47
  subject = "#{@key}:#{subject}"
27
48
  return false if @redis.llen(subject) < @limit
28
- last = @redis.lrange(subject, @limit - 1, @limit - 1).last
49
+ last = @redis.lindex(subject, -1)
29
50
  Time.now.to_i - last.to_i < @interval
30
51
  end
31
52
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_rate_limiter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -75,6 +75,38 @@ dependencies:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: coveralls
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: yard
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
78
110
  description: Redis-backed rate limiter
79
111
  email: sean.xie.sx@gmail.com
80
112
  executables: []