复述,能够采用什么样的方式来实现限流

  介绍

这篇文章主要介绍复述,能够采用什么样的方式来实现限流,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

目的:

<李>

实现访问频率限制

<李>

实现访问者ip美元在一定的时间美元时间内只能访问限制美元次

非脚本实现

private  boolean  accessLimit (String  ip, int 极限,,int ,, Jedis 能),{      ,,,boolean  result =,真的,,String  key =,“rate.limit:“, +, ip;, if  (jedis.exists(关键),{,long  afterValue =, jedis.incr(关键);,if  (afterValue 祝辞,限制),{,result =,假,,},},else  {, Transaction  Transaction =, jedis.multi ();, transaction.incr(关键);,transaction.expire(关键,,时间);,transaction.exec ();,},, return 结果,,}

以上代码有两点缺陷

可能会出现竞态条件:解决方法是用看监控率。限制:$ IP的变动,但较为麻烦;以上代码在不使用管道的情况下最多需要向复述,请求5条指令,传输过的多。

Lua脚本实现

复述,允许将Lua脚本传到复述,服务器中执行,脚本内可以调用大部分复述,命令,且复述,保证脚本的原子性:

首先需要准备Lua代码:脚本。lua

 limit then return 0 else return 1 end else redis.call("SET", key, 1) redis.call("EXPIRE", key, expire_time) return 1 end

Java

private boolean accessLimit(String ip, int limit, int timeout, Jedis connection) throws IOException { List keys = Collections.singletonList(ip); List argv = Arrays.asList(String.valueOf(limit), String.valueOf(timeout)); return 1 == (long) connection.eval(loadScriptString("script.lua"), keys, argv); } // 加载Lua代码 private String loadScriptString(String fileName) throws IOException { Reader reader = new InputStreamReader(Client.class.getClassLoader().getResourceAsStream(fileName)); return CharStreams.toString(reader); }

Lua 嵌入 Redis 优势:

减少网络开销: 不使用 Lua 的代码需要向 Redis 发送多次请求, 而脚本只需一次即可, 减少网络传输;原子操作: Redis 将整个脚本作为一个原子执行, 无需担心并发, 也就无需事务;复用: 脚本会永久保存 Redis 中, 其他客户端可继续使用。

以上是“redis能够采用什么样的方式来实现限流”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

复述,能够采用什么样的方式来实现限流