
项目中使用了流量控制是通过redis实现现做一总结记录并按照我的理解做一整理。项目情况开放平台用户注册-申请应用-申请产品一组接口申请了应用就有了应用ID应用ID具有唯一性一个用户一个应用ID而且用户在对接时必须要将应用ID作为参数传过来这样就能使用应用ID接口名称进行精确流控。如果项目涉及多个系统可以指定系统从而根据应用ID接口名称系统ID进行精确控制。流量控制方式滑动窗口、令牌。滑动窗口的方式的控制维度应用ID、接口名称、开始时间、结束时间、令牌数、时间粒度月、天、时、分、秒。令牌的方式控制维度应用ID、接口名称、开始时间、结束时间、令牌数核心处理生成redis的key应用ID、接口名称用连接如果应用ID的值是ALL则控制全部用户的接口判断当前毫秒级的时间戳是不是开始时间和结束时间开始时间和结束时间也是毫秒级的时间戳生成lua脚本使用redis的eval执行lua脚本滑动窗口的lua脚本如下redis.call(zremrangeByScore, KEYS[1], 0, ARGV[1]) local res redis.call(zcard, KEYS[1]) if (res nil) or (res tonumber(ARGV[4])) then redis.call(zadd, KEYS[1], ARGV[2], ARGV[3]) return true else return false end令牌的lua脚本如下这个将令牌数默认设置成了5local var0 redis.call(get, KEYS[1]) if var0 false then var0 0 end if tonumber(var0) 5 then return false end redis.call(incr, KEYS[1]) redis.call(expire, KEYS[1], 3600) return true判断流程先判断redis里有没有这个key如果没有就是首次即流量为0再流量跟阈值匹配超了返回false没超递增设置ttl防止非高频交易指标占用redis