Skip to content

Commit 78a11c8

Browse files
authored
Merge pull request #26 from go-redis/fix/build
Fix build
2 parents e6fcc59 + 4075ca3 commit 78a11c8

File tree

8 files changed

+56
-49
lines changed

8 files changed

+56
-49
lines changed

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ services:
88
go:
99
- 1.11.x
1010
- 1.12.x
11+
- 1.13.x
1112
- tip
1213

1314
matrix:
@@ -20,4 +21,4 @@ env:
2021
go_import_path: github.com/go-redis/redis_rate
2122

2223
before_install:
23-
- curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.17.1
24+
- curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $(go env GOPATH)/bin v1.21.0

Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@ all:
33
go test ./... -short -race
44
go test ./... -run=NONE -bench=. -benchmem
55
env GOOS=linux GOARCH=386 go test ./...
6-
go vet
76
golangci-lint run

README.md

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
[![Build Status](https://travis-ci.org/go-redis/redis_rate.svg?branch=master)](https://travis-ci.org/go-redis/redis_rate)
44
[![GoDoc](https://godoc.org/github.com/go-redis/redis_rate?status.svg)](https://godoc.org/github.com/go-redis/redis_rate)
55

6-
This package is based on [rwz/redis-gcra](https://github.com/rwz/redis-gcra) and implements [GCRA](https://en.wikipedia.org/wiki/Generic_cell_rate_algorithm) for rate limiting based on Redis. The code requires Redis version 3.2 or newer since it relies on [replicate_commands](https://redis.io/commands/eval#replicating-commands-instead-of-scripts) feature.
6+
This package is based on [rwz/redis-gcra](https://github.com/rwz/redis-gcra) and implements [GCRA](https://en.wikipedia.org/wiki/Generic_cell_rate_algorithm) (aka leaky bucket) for rate limiting based on Redis. The code requires Redis version 3.2 or newer since it relies on [replicate_commands](https://redis.io/commands/eval#replicating-commands-instead-of-scripts) feature.
77

8-
```go
8+
``` go
99
package redis_rate_test
1010

1111
import (
1212
"fmt"
13-
"time"
1413

1514
"github.com/go-redis/redis/v7"
1615
"github.com/go-redis/redis_rate/v8"
@@ -22,12 +21,8 @@ func ExampleNewLimiter() {
2221
})
2322
_ = rdb.FlushDB().Err()
2423

25-
limiter := redis_rate.NewLimiter(rdb, &redis_rate.Limit{
26-
Burst: 10,
27-
Rate: 10,
28-
Period: time.Second,
29-
})
30-
res, err := limiter.Allow("project:123")
24+
limiter := redis_rate.NewLimiter(rdb)
25+
res, err := limiter.Allow("project:123", redis_rate.PerSecond(10))
3126
if err != nil {
3227
panic(err)
3328
}

example_test.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package redis_rate_test
22

33
import (
44
"fmt"
5-
"time"
65

76
"github.com/go-redis/redis/v7"
87
"github.com/go-redis/redis_rate/v8"
@@ -14,12 +13,8 @@ func ExampleNewLimiter() {
1413
})
1514
_ = rdb.FlushDB().Err()
1615

17-
limiter := redis_rate.NewLimiter(rdb, &redis_rate.Limit{
18-
Burst: 10,
19-
Rate: 10,
20-
Period: time.Second,
21-
})
22-
res, err := limiter.Allow("project:123")
16+
limiter := redis_rate.NewLimiter(rdb)
17+
res, err := limiter.Allow("project:123", redis_rate.PerSecond(10))
2318
if err != nil {
2419
panic(err)
2520
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ module github.com/go-redis/redis_rate/v8
33
go 1.13
44

55
require (
6-
github.com/go-redis/redis/v7 v7.0.0-beta.3
6+
github.com/go-redis/redis/v7 v7.0.0-beta.4
77
github.com/stretchr/testify v1.4.0
88
)

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8
22
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
33
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
44
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
5-
github.com/go-redis/redis/v7 v7.0.0-beta.3 h1:p5g3p597f83HyVxg6qvGLLDqCYWodYWC9XmSbKPwuto=
6-
github.com/go-redis/redis/v7 v7.0.0-beta.3/go.mod h1:dohSoK1cSNPaisjbZhSk7RYyPhVx2k+4sAbJdPK5KPs=
5+
github.com/go-redis/redis/v7 v7.0.0-beta.4 h1:p6z7Pde69EGRWvlC++y8aFcaWegyrKHzOBGo0zUACTQ=
6+
github.com/go-redis/redis/v7 v7.0.0-beta.4/go.mod h1:xhhSbUMTsleRPur+Vgx9sUHtyN33bdjxY+9/0n9Ig8s=
77
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
88
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
99
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=

rate.go

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,52 @@ type Limit struct {
2222
Burst int
2323
}
2424

25+
func PerSecond(rate int) *Limit {
26+
return &Limit{
27+
Rate: rate,
28+
Period: time.Second,
29+
Burst: rate,
30+
}
31+
}
32+
33+
func PerMinute(rate int) *Limit {
34+
return &Limit{
35+
Rate: rate,
36+
Period: time.Minute,
37+
Burst: rate,
38+
}
39+
}
40+
41+
func PerHour(rate int) *Limit {
42+
return &Limit{
43+
Rate: rate,
44+
Period: time.Hour,
45+
Burst: rate,
46+
}
47+
}
48+
49+
//------------------------------------------------------------------------------
50+
2551
// Limiter controls how frequently events are allowed to happen.
2652
type Limiter struct {
27-
rdb rediser
28-
limit *Limit
53+
rdb rediser
2954
}
3055

31-
// NewLimiter returns a new Limiter that allows events up to rate r
32-
// and permits bursts of at most b tokens.
33-
func NewLimiter(rdb rediser, limit *Limit) *Limiter {
56+
// NewLimiter returns a new Limiter.
57+
func NewLimiter(rdb rediser) *Limiter {
3458
return &Limiter{
35-
rdb: rdb,
36-
limit: limit,
59+
rdb: rdb,
3760
}
3861
}
3962

4063
// Allow is shorthand for AllowN(key, 1).
41-
func (l *Limiter) Allow(key string) (*Result, error) {
42-
return l.AllowN(key, 1)
64+
func (l *Limiter) Allow(key string, limit *Limit) (*Result, error) {
65+
return l.AllowN(key, limit, 1)
4366
}
4467

4568
// AllowN reports whether n events may happen at time now.
46-
func (l *Limiter) AllowN(key string, n int) (*Result, error) {
47-
values := []interface{}{l.limit.Burst, l.limit.Rate, l.limit.Period.Seconds(), n}
69+
func (l *Limiter) AllowN(key string, limit *Limit, n int) (*Result, error) {
70+
values := []interface{}{limit.Burst, limit.Rate, limit.Period.Seconds(), n}
4871
v, err := gcra.Run(l.rdb, []string{redisPrefix + key}, values...).Result()
4972
if err != nil {
5073
return nil, err

rate_test.go

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,35 @@ import (
1010
"github.com/go-redis/redis_rate/v8"
1111
)
1212

13-
func rateLimiter(limit *redis_rate.Limit) *redis_rate.Limiter {
13+
func rateLimiter() *redis_rate.Limiter {
1414
ring := redis.NewRing(&redis.RingOptions{
1515
Addrs: map[string]string{"server0": ":6379"},
1616
})
17-
if err := ring.FlushDb().Err(); err != nil {
17+
if err := ring.FlushDB().Err(); err != nil {
1818
panic(err)
1919
}
20-
return redis_rate.NewLimiter(ring, limit)
20+
return redis_rate.NewLimiter(ring)
2121
}
2222

2323
func TestAllow(t *testing.T) {
24-
l := rateLimiter(&redis_rate.Limit{
25-
Burst: 10,
26-
Rate: 10,
27-
Period: time.Second,
28-
})
24+
l := rateLimiter()
25+
limit := redis_rate.PerSecond(10)
2926

30-
res, err := l.Allow("test_id")
27+
res, err := l.Allow("test_id", limit)
3128
assert.Nil(t, err)
3229
assert.True(t, res.Allowed)
3330
assert.Equal(t, res.Remaining, 9)
3431
assert.Equal(t, res.RetryAfter, time.Duration(-1))
3532
assert.InDelta(t, res.ResetAfter, 100*time.Millisecond, float64(10*time.Millisecond))
3633

37-
res, err = l.AllowN("test_id", 2)
34+
res, err = l.AllowN("test_id", limit, 2)
3835
assert.Nil(t, err)
3936
assert.True(t, res.Allowed)
4037
assert.Equal(t, res.Remaining, 7)
4138
assert.Equal(t, res.RetryAfter, time.Duration(-1))
4239
assert.InDelta(t, res.ResetAfter, 300*time.Millisecond, float64(10*time.Millisecond))
4340

44-
res, err = l.AllowN("test_id", 1000)
41+
res, err = l.AllowN("test_id", limit, 1000)
4542
assert.Nil(t, err)
4643
assert.False(t, res.Allowed)
4744
assert.Equal(t, res.Remaining, 0)
@@ -50,17 +47,14 @@ func TestAllow(t *testing.T) {
5047
}
5148

5249
func BenchmarkAllow(b *testing.B) {
53-
l := rateLimiter(&redis_rate.Limit{
54-
Burst: 1000,
55-
Rate: 1000,
56-
Period: time.Second,
57-
})
50+
l := rateLimiter()
51+
limit := redis_rate.PerSecond(10000)
5852

5953
b.ResetTimer()
6054

6155
b.RunParallel(func(pb *testing.PB) {
6256
for pb.Next() {
63-
_, err := l.Allow("foo")
57+
_, err := l.Allow("foo", limit)
6458
if err != nil {
6559
b.Fatal(err)
6660
}

0 commit comments

Comments
 (0)