首页 » PHP教程 » php滑动窗口技巧_goredislua实现大年夜流量限流之滑动窗口

php滑动窗口技巧_goredislua实现大年夜流量限流之滑动窗口

访客 2024-12-01 0

扫一扫用手机浏览

文章目录 [+]

本日就为大家分享和演示go 、redis和lua脚本实现的一种大略限流方法:滑动窗口,直接上代码

package mainimport ( "fmt" "github.com/gin-gonic/gin" "github.com/go-redis/redis" "net/http" "time")var redisDb redis.Clientvar luaScript = ` local key = KEYS[1];-- 键 key local now_time = ARGV[1];-- 值 value local before_time = ARGV[2];-- 间隔韶光之前,纳秒 local period = ARGV[3];-- 韶光间隔,多少秒内,设置过期韶光 local requests = ARGV[4];-- 韶光间隔内的要求次数 redis.pcall("zadd", key, now_time, now_time);-- zset构造设置一个key,zadd(key,value,scores) redis.pcall("zremrangebyscore", key, 0, before_time); -- 移除scores范围在0到bofore_time之间的值,即移除韶光窗口之前的行为记录,剩下的都是韶光窗口内的 local count = redis.pcall("zcard", key); -- 获取窗口内的要求数量 redis.pcall("expire", key, period); -- 设置 zset 过期韶光,避免不生动用户持续占用内存 if tonumber(count) > tonumber(requests) then return 2; end return 1;`var evalSha stringfunc init() { initRedisClient()}func initRedisClient() { redisDb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) var err error evalSha, err = redisDb.ScriptLoad(luaScript).Result() if err != nil { panic(err) }}func main() { // 1.创建路由 r := gin.Default() // 2.绑定路由规则,实行的函数 // gin.Context,封装了request和response r.GET("/count", func(c gin.Context) { doRequest() c.String(http.StatusOK, "ok") }) // 3.监听端口,默认在8080 // Run("里面不指定端口号默认为8080") r.Run(":8000")}func doRequest() { success := isPermited("oossnaa", "add/Cart", 3, 10) if success { fmt.Println("成功") //处理下单逻辑 } else { fmt.Println("失落败") // 返回要求或者抛出非常、panic }}func isPermited(uid string, action string, period, maxCount int) bool { key := fmt.Sprintf("%v_%v", uid, action) now := time.Now().UnixNano() //纳秒 beforeTime := now - int64(period1000000000) res, err := redisDb.EvalSha(evalSha, []string{key}, now, beforeTime, period, maxCount).Result() if err != nil { panic(err) } if res.(int64) == int64(2) { return false } return true}

利用了gin框架,现在AB工具来压测下,实际也可以在代码中for循环大量要求来测试

php滑动窗口技巧_goredislua实现大年夜流量限流之滑动窗口

ab -n 20 -t 3 "http://localhost:8000/count"

php滑动窗口技巧_goredislua实现大年夜流量限流之滑动窗口
(图片来自网络侵删)

本次案例需求是3秒的韶光窗口一个用户的要求数不超过10个,以是AB 命令加上 -t 3

-t的注释是:测试所进行的最大秒数。
其内部隐含值是-n 50000。
它可以使对做事器的测试限定在一个固定的总韶光以内。
默认时,没有韶光限定。

我对-n 20 -t 3 的理解是,3秒内实行20个要求,但是实际的结果是3秒内有1000多个要求,这个有点不太明白,还须要各位大佬指示。

但是并不影响本次案例的须要背景,便于查看我将成功的要求加上序号,末了当作果:

只有十个要求成功了,别的的失落败了。

回顾前期文章

go+redis+lua实现秒杀

php+redis+lua实现秒杀

后续分享和演示限流的其余两个方法:令牌桶和漏斗算法

标签:

相关文章

介绍白点控制之路,从原理到方法

白点,作为生活中常见的现象,无处不在。对于如何控制白点,许多人却感到困惑。本文将从原理出发,探讨白点的控制方法,并结合实际案例,为...

PHP教程 2025-01-03 阅读1 评论0

介绍直播王者,如何开启你的电竞直播之旅

随着电竞产业的蓬勃发展,越来越多的年轻人投身于电竞直播行业。王者荣耀作为一款备受欢迎的MOBA手游,吸引了大量玩家和观众。如何开启...

PHP教程 2025-01-03 阅读1 评论0