设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

生活中随处可见的限流,在Java中又是怎么应用的呢?(2)

发布时间:2019-09-20 10:42 所属栏目:21 来源:Java之高级架构
导读:可以使用Redis+Lua的方式来实现,大致的lua脚本代码如下: localkey=rate.limit:..KEYS[1]--限流KEY locallimit=tonumber(ARGV[1])--限流大小 localcurrent=tonumber(redis.call('get',key)or0) ifcurrent+1limitth

可以使用Redis+Lua的方式来实现,大致的lua脚本代码如下:

  1. local key = "rate.limit:" .. KEYS[1] --限流KEY 
  2. local limit = tonumber(ARGV[1]) --限流大小 
  3. local current = tonumber(redis.call('get', key) or "0") 
  4. if current + 1 > limit then --如果超出限流大小 
  5.  return 0 
  6. else --请求数+1,并设置1秒过期 
  7.  redis.call("INCRBY", key,"1") 
  8.  redis.call("expire", key,"1") 
  9.  return current + 1 

Java代码如下:

  1. public static boolean accquire() throws IOException, URISyntaxException { 
  2.  Jedis jedis = new Jedis("127.0.0.1"); 
  3.  File luaFile = new File(RedisLimitRateWithLUA.class.getResource("/").toURI().getPath() + "limit.lua"); 
  4.  String luaScript = FileUtils.readFileToString(luaFile); 
  5.  String key = "ip:" + System.currentTimeMillis()/1000; // 当前秒 
  6.  String limit = "5"; // 最大限制 
  7.  List<String> keys = new ArrayList<String>(); 
  8.  keys.add(key); 
  9.  List<String> args = new ArrayList<String>(); 
  10.  args.add(limit); 
  11.  Long result = (Long)(jedis.eval(luaScript, keys, args)); // 执行lua脚本,传入参数 
  12.  return result == 1; 

解释:

  • Java代码传入key和最大的限制limit参数进lua脚本
  • 执行lua脚本(lua脚本判断当前key是否超过了最大限制limit)
  • 如果超过,则返回0(限流)
  • 如果没超过,返回1(程序继续执行)

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读