Go 基于 Redis 通用频率控制的实现

栏目: 数据库 · 发布时间: 6年前

内容简介:360搜索百科问答里通用的频率控制服务这两种频率控制类型都是在指定范围时间count 类型直接利用 redis 的

360搜索百科问答里通用的频率控制服务 Koala ,是用 GO 语言开发的后端独立服务。其中有两种控制的频率控制类型分别是

  • count (计数型)

  • leak (漏桶型)

这两种频率控制类型都是在指定范围时间 time 内,最多可以访问 count 次数,但究竟有什么区别呢?下面我们来看看他们的实现方式。

count(计数型)

count 类型直接利用 redissetex() 来计数和设置时间。也就是,当第一次请求过来的时候,创建一个过期时间为 time 的 key ,并设置为 1 ,在接下去的时间内,每次请求过来通过的话 key 就加 1 ,当达到 count 的时候,就会禁止访问,直到 key 过期。

具体的实现如下:

rule.go

这种方法实现起来比较简单,但是这可能出现短时间流量暴增问题。比如,某个接口限制是 5 秒只能访问 3 次,在前 1 秒,只访问了一次,在 5 秒快过期的时候,突然访问了 2 次,在 6 秒的时候又访问了 3 次,相当于在 2 秒内访问了 5 次,流量短时间跟预期的比翻了一倍,所以后面添加了 漏桶型 来解决这个问题。

leak(漏桶型)

漏桶模式是基于漏桶算法,能够平滑网络上的流量,简单的讲就是在过去 time 秒内,访问次数不能超过 count 次,解决 count 流量倍增问题。

漏桶模式可以利用 redis 的 list 数据结构或 zset 数据结构来实现。

采用List的数据结构

存储设计和判别条件

  1. 采用 redis 的  list 数据结构,实现一种先进先出的队列。

  2. 队列的每个元素,存储一个时间戳,记录一次访问的时间。

  3. 漏桶大小为 count。

  4. 如果第 count 个元素的时间戳,距离当前时间,小于等于 time ,则说明漏桶有“溢出”。

过期元素清除

因为 redis 不能设置 list 里元素过期时间,所以需要手动删除,有两种方法:

  1. 可以在每次访问后清除队尾多余元素。

  2. 可以利用 go 协程进行异步处理,不影响速度。

可能出现一个key访问一段时间后突然不访问,导致内存浪费,还需要设置大于 time 的过期时间。

具体实现如下:

rule.go

采用Zset的数据结构

存储设计和判别条件

  1. 采用 redis 的  zset 数据结构,实现一种时间戳有序集合。

  2. 集合的每个元素,  member 和  score 都为时间戳(纳秒级别)。

  3. 漏桶大小为  count

  4. 如果在(当前时间戳 - time)的时间戳内元素的个数超过 count 则说明漏桶有“溢出”。

过期元素清除

和上面 list 数据结构基本类似,不同的是每次清理是清理 score 小于当前时间戳 - time的时间戳。

具体实现如下:

rule.go

问题模拟并解决

让我们来模拟上面count出现的问题并利用leak解决。

main.go

运行结果如下图所示,可以看出count类型在第5秒6秒的时候通过了5次,而leak时刻保持5秒内最多访问3次。

Go 基于 Redis 通用频率控制的实现


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cracking the Coding Interview

Cracking the Coding Interview

Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95

Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具