Files
limit/example_test.go

69 lines
2.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Copyright 2025 肖其顿
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package limit_test
import (
"fmt"
"time"
"github.com/xiaoqidun/limit"
"golang.org/x/time/rate"
)
// ExampleLimiter 演示了 limit 包的基本用法。
func ExampleLimiter() {
// 创建一个使用默认配置的 Limiter 实例
limiter := limit.New()
// 程序退出前,优雅地停止后台任务,这非常重要
defer limiter.Stop()
// 为一个特定的测试键获取一个速率限制器
// 限制为每秒2个请求最多允许3个并发桶容量
testKey := "testKey"
rateLimiter := limiter.Get(testKey, rate.Limit(2), 3)
// 模拟连续的请求
for i := 0; i < 5; i++ {
if rateLimiter.Allow() {
fmt.Printf("请求 %d: 已允许\n", i+1)
} else {
fmt.Printf("请求 %d: 已拒绝\n", i+1)
}
time.Sleep(100 * time.Millisecond)
}
// 手动移除一个不再需要的限制器
limiter.Del(testKey)
// Output:
// 请求 1: 已允许
// 请求 2: 已允许
// 请求 3: 已允许
// 请求 4: 已拒绝
// 请求 5: 已拒绝
}
// ExampleNewWithConfig 展示了如何使用自定义配置。
func ExampleNewWithConfig() {
// 自定义配置
config := limit.Config{
ShardCount: 64, // 分片数量必须是2的幂
GCInterval: 5 * time.Minute, // GC 检查周期
Expiration: 15 * time.Minute, // 限制器过期时间
}
// 使用自定义配置创建一个 Limiter 实例
customLimiter := limit.NewWithConfig(config)
defer customLimiter.Stop()
fmt.Println("使用自定义配置的限制器已成功创建")
// Output:
// 使用自定义配置的限制器已成功创建
}