redis+lua限流

nginx+lua(openresty/kong)

Lua 是一种轻量小巧的脚本语言,动态解释型语言 ,一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。
主要特点是:程序代码级热更新,下载最新代码,实时更新,实时更新,不需要编译环节,比如Nginx

1: 比如游戏引擎领域的cocos2d-x、unity,由于引擎自身使用的c++或者c#作为编写语言,游戏前端发布后,发现bug或者发布新逻辑,都需要重新出包,周期过长,lua作为脚本语言,可以以资源的形式下载,重新加载运行,周期快,且效率损失有限
2:服务端使用,比较火的也就是nginx+lua的形式,后来整合成框架openresty,基本也是利用nginx的高性能+lua脚本的灵活性,逻辑修改之后只需要触发重新加载脚本就可以,开发运行效率都比较高,相比传统c++、java等需要重新编译部署,开发效率高很多

京东实现

  1. 有一个定时任务10秒更新限流配置(黑白名单和限流开关)
    local ok, err = new_timer(delay, refresh)
  2. 主要逻辑
-- 规则设置
-- 排队规则,即并发数控制+防刷规则,即请求频率控制(集群TPS,用户TPS,单IP的TPS[取不到用户的时候才生效])
-- AddOn:当前代码无法校验TrackID合法性,故全部使用IP限流,请注意第三个数字!!!(忽略第二个)
global_key_rules = {
  ['/cart/add_to_cart_ajax.html'] = {1000, -1, 50},
  ['/cart/fetch_cart_num.html'] = {1000, -1, 50},
  ['/cart/sync_cart.html'] = {500, -1, 30},
  ['/order/confirm_order.html'] = {500, -1, 30},
  ['/order/sync_order_cart.html'] = {500, -1, 30},
  ['/order/edit_user_address.html'] = {300, -1, 20},
  ['/order/sync_user_coupon.html'] = {500, -1, 30},
  ['/order/submit_order.html'] = {200, -1, 20}
}
-- 主要判断逻辑 
-- key 为限制的资源
-- size 为TPS值
function limit(red, key, size)
    --访问量+1
    local count = red:incr(key)
    -- 判断是否过期,如果过期,修改过期时间为1秒,ttl返回剩余的生存时间,key不
    local ttl = red:ttl(key)
    if ttl < 0 then
      local time = red:expire(key,1)
    end
    -- 判断超过TPS,超过则限流
    if count > size  then
       return false
    end
    return true
 end

ttl是为防止某些key在未设置超时时间并长时间已经存在的情况下做的保护的判断;

Redis TTL 命令:
当 key 不存在时,返回 -2 。
当 key 存在但没有设置剩余生存时间时,返回 -1 。
否则,以毫秒为单位,返回 key 的剩余生存时间。

Redis Incr 命令:
将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作

通过redis防止重复提交(无并发限流)

通过redis也可以在服务层做限流,缺点是此时流量已打到服务器,没有在nginx层做防护好。
不过,可以在服务层做些防重复提交的防护,示例如下:
例如:PC端查询订单列表,同一用户和相同查询条件100毫秒内只能查询一次

通过Redis 字符串命令SETEX key seconds value实现
setex 惟一标识 过期时间 当前时间
其中:key:为资源惟一标识=uid+param
seconds:过期时间=repeat_request_ttl
valule:当前时间

repeat_request_ttl: 每次查询的时间间隔=100
表示:同一用户和相同查询条件100毫秒内只参查询一次

if(key 存在){
  获取key值的value=上次请求时间
  if(上次请求时间<repeat_request_ttl){
     请求频率过快
   }
}
set key 当前时间 过期时间
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容