go语言实现令牌桶限流

简单实现令牌桶,复制即可用

package main

import (
    "fmt"
    "log"
    "time"
)

var startTime = time.Now()

func main() {
    bucket()
}
//令牌桶案例
func bucket() {
    quantum := int64(1)
    rate := float64(2)
    capacity := int64(2)
    count := int64(1)
    fillInterval := time.Duration(1e9 * float64(quantum) / rate)
    fmt.Printf("fillInterval : %d \n", fillInterval)
    availableTokens := int64(2)

    var lastTick int64

    t := time.NewTicker(400 * time.Millisecond)

    for e := range t.C {
        //当前时间与服务启动时间的差值,除以时间间隔 -> 算出数量
        tick := int64(time.Now().Sub(startTime) / fillInterval)
        if availableTokens >= capacity {
            fmt.Printf("ok use [%d]\n", availableTokens)
        } else {
            //两个相减,算出真正的可用数量
            availableTokens += (tick - lastTick) * quantum
            fmt.Printf("tick - lastTick : %d\n", availableTokens)
            if availableTokens > capacity {
                availableTokens = capacity
            }
            lastTick = tick
        }
        if availableTokens <= 0 {
            log.Println("no availableTokens")
        } else {
            if count > availableTokens {
                count = availableTokens
            }
            availableTokens -= count
            fmt.Printf("[%+v], availableTokens has [%d]\n", e, availableTokens)
        }

    }
}


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升...
    阿斯蒂芬2阅读 12,751评论 1 28
  • 项目需要使用限流措施,查阅后主要使用令牌桶算法实现,为了更灵活的实现限流,就自己实现了一个简单的基于令牌桶算法的限...
    begonia_rich阅读 26,327评论 6 19
  • 聊聊高并发系统限流特技-1来自开涛的博客 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是...
    meng_philip123阅读 6,850评论 1 20
  • 摘要:在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。而有些场景并不能用缓存和降级来解决,因此需有一种...
    落羽成霜丶阅读 2,227评论 0 18
  • 我旅游过许多的地方,有美丽无比的西安;有科技发达的北京;有拥有辽阔草原的内蒙古;有风味独特的平遥;⋯⋯但我印...
    bf307a6672d6阅读 266评论 0 0

友情链接更多精彩内容