go 简单计数器
发布时间:2021-12-07 编辑:jiaochengji.com
教程集为您提供go 简单计数器等资源,欢迎您收藏本站,我们将为您提供最新的go 简单计数器资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h2>go 简单计数器</h2>
<ul><li>限流器定义</li></ul><pre><code class="lang-go hljs"><span class="token keyword">type</span> RequestLimitService <span class="token keyword">struct</span> <span class="token punctuation">{</span>
Interval time<span class="token punctuation">.</span>Duration <span class="token comment">// 设置时间窗口大小</span>
MaxCount <span class="token builtin">int</span> <span class="token comment">// 窗口内能支持的最大请求数(阈值)</span>
Lock sync<span class="token punctuation">.</span>Mutex <span class="token comment">// 并发控制锁</span>
ReqCount <span class="token builtin">int</span> <span class="token comment">// 当前窗口请求数(计数器)</span>
<span class="token punctuation">}</span>
</code></pre>
<ul><li>实现限流器的两个核心方法</li></ul><pre><code class="lang-go hljs">
<span class="token comment">// 判断当前窗口请求数是否大于最大请求数</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>reqLimit <span class="token operator">*</span>RequestLimitService<span class="token punctuation">)</span> <span class="token function">IsAvailable</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span>
reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">defer</span> reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> reqLimit<span class="token punctuation">.</span>ReqCount <span class="token operator"><</span> reqLimit<span class="token punctuation">.</span>MaxCount
<span class="token punctuation">}</span>
<span class="token comment">// 对当前窗口请求数 1</span>
<span class="token keyword">func</span> <span class="token punctuation">(</span>reqLimit <span class="token operator">*</span>RequestLimitService<span class="token punctuation">)</span> <span class="token function">Increase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">defer</span> reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
reqLimit<span class="token punctuation">.</span>ReqCount <span class="token operator"> =</span> <span class="token number">1</span>
<span class="token punctuation">}</span>
</code></pre>
<ul><li>生成限流器</li></ul><pre><code class="lang-go hljs">
<span class="token keyword">func</span> <span class="token function">NewRequestLimitService</span><span class="token punctuation">(</span>interval time<span class="token punctuation">.</span>Duration<span class="token punctuation">,</span> maxCnt <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token operator">*</span>RequestLimitService <span class="token punctuation">{</span>
reqLimit <span class="token operator">:=</span> <span class="token operator">&</span>RequestLimitService<span class="token punctuation">{</span>
Interval<span class="token punctuation">:</span> interval<span class="token punctuation">,</span>
MaxCount<span class="token punctuation">:</span> maxCnt<span class="token punctuation">,</span>
<span class="token punctuation">}</span>
<span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
ticker <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">NewTicker</span><span class="token punctuation">(</span>interval<span class="token punctuation">)</span> <span class="token comment">// 当达到窗口时间,将计数器清零</span>
<span class="token keyword">for</span> <span class="token punctuation">{</span>
<span class="token operator"><-</span>ticker<span class="token punctuation">.</span>C
reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"Reset Count..."</span><span class="token punctuation">)</span>
reqLimit<span class="token punctuation">.</span>ReqCount <span class="token operator">=</span> <span class="token number">0</span>
reqLimit<span class="token punctuation">.</span>Lock<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> reqLimit
<span class="token punctuation">}</span>
</code></pre>
您可能感兴趣的文章:
Golang 基础教程
Golang库集合
Go协程与协程池
Go 协程的开启和退出
Go语言发展历史、核心、特性及学习路线
Go 语言一本通
Go语言爱好者周刊:第 78 期 — 这道关于 goroutine 的题
go语言和php的区别是什么?
Golang并发利用sync.WaitGroup实现协程同步
dubbo-go 的开发、设计与功能介绍
[关闭]