12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- package main
- import (
- "flag"
- "fmt"
- "log"
- "runtime"
- "strconv"
- "sync"
- "sync/atomic"
- "time"
- "github.com/tal-tech/go-zero/core/limit"
- "github.com/tal-tech/go-zero/core/stores/redis"
- )
- const seconds = 5
- var (
- rdx = flag.String("redis", "localhost:6379", "the redis, default localhost:6379")
- rdxType = flag.String("redisType", "node", "the redis type, default node")
- rdxPass = flag.String("redisPass", "", "the redis password")
- rdxKey = flag.String("redisKey", "rate", "the redis key, default rate")
- threads = flag.Int("threads", runtime.NumCPU(), "the concurrent threads, default to cores")
- )
- func main() {
- flag.Parse()
- store := redis.NewRedis(*rdx, *rdxType, *rdxPass)
- fmt.Println(store.Ping())
- lmt := limit.NewPeriodLimit(seconds, 5, store, *rdxKey)
- timer := time.NewTimer(time.Second * seconds)
- quit := make(chan struct{})
- defer timer.Stop()
- go func() {
- <-timer.C
- close(quit)
- }()
- var allowed, denied int32
- var wait sync.WaitGroup
- for i := 0; i < *threads; i++ {
- i := i
- wait.Add(1)
- go func() {
- for {
- select {
- case <-quit:
- wait.Done()
- return
- default:
- if v, err := lmt.Take(strconv.FormatInt(int64(i), 10)); err == nil && v == limit.Allowed {
- atomic.AddInt32(&allowed, 1)
- } else if err != nil {
- log.Fatal(err)
- } else {
- atomic.AddInt32(&denied, 1)
- }
- }
- }
- }()
- }
- wait.Wait()
- fmt.Printf("allowed: %d, denied: %d, qps: %d\n", allowed, denied, (allowed+denied)/seconds)
- }
|