redis-gcra 0.2.0 → 0.3.0
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.
- checksums.yaml +4 -4
- data/README.md +24 -14
- data/lib/redis-gcra/version.rb +1 -1
- data/vendor/inspect_gcra_ratelimit.lua +3 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4ce10313659f0a4e111a77b037e45afff5e44f9
|
4
|
+
data.tar.gz: 791b63e5937c82a7e0757064edb45016bb90e3df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4dd33796a611fe9c0d57eae0ba2ff2d7b95a38c8f3da96e98b42f9a9c57a923b53d412c103d43319e2a20c019692be07a8ad9f81366d1ba1e7a85b1fdafe9120
|
7
|
+
data.tar.gz: 581125696884139ac3b83972aac95c859a9ee4c163e64b1b02a24e2b52705374dae48e5f76b08da84d240bf935fa60123147391ed3b048ca8d9ebd53e38970da
|
data/README.md
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
# RedisGCRA
|
2
2
|
[](https://travis-ci.org/rwz/redis-gcra)
|
3
3
|
|
4
|
-
This gem is an implementation of GCRA for rate limiting based on Redis.
|
5
|
-
code requires Redis version 3.2 or newer since it relies on
|
4
|
+
This gem is an implementation of [GCRA][gcra] for rate limiting based on Redis.
|
5
|
+
The code requires Redis version 3.2 or newer since it relies on
|
6
6
|
[`replicate_commands`][redis-replicate-commands] feature.
|
7
7
|
|
8
|
+
[gcra]: https://en.wikipedia.org/wiki/Generic_cell_rate_algorithm
|
8
9
|
[redis-replicate-commands]: https://redis.io/commands/eval#replicating-commands-instead-of-scripts
|
9
10
|
|
10
11
|
## Installation
|
@@ -41,16 +42,16 @@ result = RedisGCRA.limit(
|
|
41
42
|
)
|
42
43
|
|
43
44
|
result.limited? # => false - request should not be limited
|
44
|
-
result.
|
45
|
+
result.remaining # => 998 - remaining number of requests until limited
|
45
46
|
result.retry_after # => nil - can retry without delay
|
46
47
|
result.reset_after # => ~0.6 - in 0.6 seconds rate limiter will completely reset
|
47
48
|
|
48
49
|
# call limit 499 more times in rapid succession and you get:
|
49
50
|
|
50
|
-
result.limited? # => true
|
51
|
-
result.remaining # => 0
|
52
|
-
result.retry_after # => ~1.
|
53
|
-
result.reset_after # => ~600
|
51
|
+
result.limited? # => true - request should be limited
|
52
|
+
result.remaining # => 0 - no requests can be made at this point
|
53
|
+
result.retry_after # => ~1.2 - can retry in 1.2 seconds
|
54
|
+
result.reset_after # => ~600 - in 600 seconds rate limiter will completely reset
|
54
55
|
```
|
55
56
|
|
56
57
|
The implementation utilizes single key in Redis that matches the key you pass
|
@@ -64,7 +65,7 @@ redis.del "overall-account/bob@example.com"
|
|
64
65
|
```
|
65
66
|
|
66
67
|
You call also retrieve the current state of rate limiter for particular key
|
67
|
-
without actually modifying the state.
|
68
|
+
without actually modifying the state. In order to do that, use the `peek`
|
68
69
|
method:
|
69
70
|
|
70
71
|
```ruby
|
@@ -76,14 +77,23 @@ RedisGCRA.peek(
|
|
76
77
|
period: 60 # seconds
|
77
78
|
)
|
78
79
|
|
79
|
-
result.limited? # => true
|
80
|
-
result.remaining # => 0
|
81
|
-
result.retry_after # =>
|
82
|
-
result.reset_after # => ~600
|
80
|
+
result.limited? # => true - current state is limited
|
81
|
+
result.remaining # => 0 - no requests can be made
|
82
|
+
result.retry_after # => ~0.6 - in 0.6 seconds remaining will become 1
|
83
|
+
result.reset_after # => ~600 - in 600 seconds rate limiter will completely reset
|
83
84
|
```
|
84
85
|
|
86
|
+
## Inspiration
|
87
|
+
|
88
|
+
This code was inspired by this great [blog post][blog-post] by [Brandur
|
89
|
+
Leach][brandur] and his amazing work on [throttled Go package][throttled].
|
90
|
+
|
91
|
+
[blog-post]: https://brandur.org/rate-limiting
|
92
|
+
[brandur]: https://github.com/brandur
|
93
|
+
[throttled]: https://github.com/throttled/throttled
|
94
|
+
|
85
95
|
## License
|
86
96
|
|
87
|
-
The gem is available as open source under the terms of the [MIT
|
88
|
-
License](http://opensource.org/licenses/MIT).
|
97
|
+
The gem is available as open source under the terms of the [MIT License][mit].
|
89
98
|
|
99
|
+
[mit]: http://opensource.org/licenses/MIT
|
data/lib/redis-gcra/version.rb
CHANGED
@@ -31,15 +31,14 @@ if reset_after == 0 then
|
|
31
31
|
end
|
32
32
|
|
33
33
|
local limited
|
34
|
+
local retry_after
|
34
35
|
|
35
36
|
if remaining == 0 then
|
36
37
|
limited = 1
|
38
|
+
retry_after = emission_interval - diff
|
37
39
|
else
|
38
40
|
limited = 0
|
41
|
+
retry_after = -1
|
39
42
|
end
|
40
43
|
|
41
|
-
-- retry_after is always nil because it doesn't make much sense in inspect
|
42
|
-
-- context
|
43
|
-
local retry_after = -1
|
44
|
-
|
45
44
|
return {limited, remaining, tostring(retry_after), tostring(reset_after)}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis-gcra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Pravosud
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|