• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

使用redis调用lua脚本的方式对接口进行限流

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

java端实现:

   //初始化一个redis可执行的lua
            DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<List>();
            defaultRedisScript.setResultType(List.class);
            defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis_limit.lua")));

            List<String> key = new ArrayList<>();//这里虽然使用List集合,但是暂时只存储一个值(Key+时间戳)
            List<String> args = Lists.newArrayList("参数值可以是多个");
            //这里的StringRedisTemplate需要自己初始化并配置
            List<String> ret = new StringRedisTemplate().execute(defaultRedisScript, key, args);//返回也是一个List,就是在lua中的返回值,默认取出第一个即可

lua脚本执行代码:

local key= KEYS[1] --获取需要限流接口的key(每秒都会生成一个新的,当然key的过期时间也是1秒)
local limitRqNum= tonumber(ARGV[1]) --每秒上限访问个数(获取java调用脚本阶段传入的参数)
local currRqNum= tonumber(redis.call('get',key) or "0") --获取当前redis中当前秒内已经存储的请求总数
if currRqNum+1 > limitRqNum then --超出流量限制大小的话
   return 0
else --如果没有超出限制请求大小则将redis中记录的请求总数+1,并设置该key
   redis.call('INCRBY',key,"1") --将请求计数+1
   --设置过期时间2秒,这个设置主要是让这个key既能自动失效删除,又能保证在至少1秒内不过期仍旧可以看到当前秒内总请求记录数
   redis.call('EXPIRE',key,"2")
   return 1
end

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
关于MysqlProxyLUA实现Mysql读写分离发布时间:2022-07-22
下一篇:
cocos2dx-luahttp请求下载图片,使用XMLHttpRequest类发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap