go_redis_lua

package module
v0.0.0-...-e7964c4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 5, 2024 License: MIT Imports: 4 Imported by: 0

README

go-redis-lua

go redis lua常用脚本封装

令牌桶算法

测试每3秒5次限流,更多测试实例移步token_bucket_limiter_test.go

// TestTokenBucketLimit_Allowed_3s5 测试每3秒5次限流
func TestTokenBucketLimit_Allowed_3s5(t *testing.T) {
	rdb := redis.NewClient(&redis.Options{
		Addr: "127.0.0.1:6379",
		DB:   0,
	})
	limiter := NewTokenBucketLimit(&TokenBucketLimitOption{
		RDB:      rdb,
		Count:    5,
		Duration: time.Second * 3,
		Burst:    10,
	})

	wg := sync.WaitGroup{}
	ctx := context.Background()
	ch := make(chan struct{}, 10)
	for i := 1; i <= 100; i++ {
		i := i
		wg.Add(1)
		if i%10 == 0 {
			t.Logf("第%d秒", (i/10-1)*3)
		}
		go func() {
			ch <- struct{}{}
			allowed, remain, err := limiter.Allowed(ctx, 1)
			t.Logf("i: %d allowed: %v remain: %d err %v", i, allowed, remain, err)
			wg.Done()
			<-ch
		}()
		if i%10 == 0 {
			time.Sleep(3 * time.Second)
		}
	}
	wg.Wait()
}
    token_bucket_limiter_test.go:66: 第0秒
    token_bucket_limiter_test.go:71: i: 3 allowed: true remain: 4 err <nil>
    token_bucket_limiter_test.go:71: i: 8 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 9 allowed: true remain: 3 err <nil>
    token_bucket_limiter_test.go:71: i: 7 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 5 allowed: true remain: 5 err <nil>
    token_bucket_limiter_test.go:71: i: 6 allowed: true remain: 1 err <nil>
    token_bucket_limiter_test.go:71: i: 2 allowed: true remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 1 allowed: true remain: 2 err <nil>
    token_bucket_limiter_test.go:71: i: 10 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 4 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:66: 第3秒
    token_bucket_limiter_test.go:71: i: 14 allowed: true remain: 4 err <nil>
    token_bucket_limiter_test.go:71: i: 13 allowed: true remain: 3 err <nil>
    token_bucket_limiter_test.go:71: i: 11 allowed: true remain: 2 err <nil>
    token_bucket_limiter_test.go:71: i: 17 allowed: true remain: 1 err <nil>
    token_bucket_limiter_test.go:71: i: 19 allowed: true remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 18 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 15 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 16 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 12 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 20 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:66: 第6秒
    token_bucket_limiter_test.go:71: i: 29 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 28 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 27 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 24 allowed: true remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 23 allowed: true remain: 1 err <nil>
    token_bucket_limiter_test.go:71: i: 22 allowed: true remain: 2 err <nil>
    token_bucket_limiter_test.go:71: i: 25 allowed: true remain: 3 err <nil>
    token_bucket_limiter_test.go:71: i: 21 allowed: true remain: 4 err <nil>
    token_bucket_limiter_test.go:71: i: 30 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 26 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:66: 第9秒
    token_bucket_limiter_test.go:71: i: 34 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 33 allowed: true remain: 4 err <nil>
    token_bucket_limiter_test.go:71: i: 32 allowed: true remain: 3 err <nil>
    token_bucket_limiter_test.go:71: i: 35 allowed: true remain: 1 err <nil>
    token_bucket_limiter_test.go:71: i: 38 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 37 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 36 allowed: true remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 39 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 40 allowed: false remain: 0 err <nil>
    token_bucket_limiter_test.go:71: i: 31 allowed: true remain: 2 err <nil>

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type TokenBucketLimitOption

type TokenBucketLimitOption struct {
	RDB      *redis.Client
	Count    int64         // 速率,请求数
	Duration time.Duration // 时长,比如:每秒3次/每分钟10次
	Burst    int64         // 令牌桶的大小
	Prefix   string        // redis key前缀
}

type TokenBucketLimiter

type TokenBucketLimiter struct {
	// contains filtered or unexported fields
}

func NewTokenBucketLimit

func NewTokenBucketLimit(option *TokenBucketLimitOption) *TokenBucketLimiter

func (*TokenBucketLimiter) Allowed

func (t *TokenBucketLimiter) Allowed(ctx context.Context, requested int64) (allowed bool, remainingTokens int64, err error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL