加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-09-20 16:39:12 所属栏目:优化 来源:Java之高级架构
导读:一、限流基础知识介绍 为啥要限流,相信就不用我多说了。 比如,我周末去饭店吃饭,但是人太多了,我只能去前台拿个号,等号码到我的时候才能进饭店吃饭。如果饭店没有限流怎么办?一到饭点,人都往里冲,而饭店又处理不了这么多人流,很容易就出事故(饭店

可以使用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(程序继续执行)

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读