redis能够采用什么样的方式来实现限流
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍redis能够采用什么样的方式来实现限流,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!目的:实现访问频率限制实现访问者 $ip 在一定的时间 $time 内只能
千家信息网最后更新 2026年11月02日redis能够采用什么样的方式来实现限流
这篇文章主要介绍redis能够采用什么样的方式来实现限流,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
目的:
实现访问频率限制
实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次
非脚本实现
private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.limit:" + ip; if (jedis.exists(key)) { long afterValue = jedis.incr(key); if (afterValue > limit) { result = false; } } else { Transaction transaction = jedis.multi(); transaction.incr(key); transaction.expire(key, time); transaction.exec(); } return result; }以上代码有两点缺陷
可能会出现竞态条件: 解决方法是用 WATCH 监控 rate.limit:$IP 的变动, 但较为麻烦;以上代码在不使用 pipeline 的情况下最多需要向Redis请求5条指令, 传输过多.
Lua脚本实现
Redis 允许将 Lua 脚本传到 Redis 服务器中执行, 脚本内可以调用大部分 Redis 命令, 且 Redis 保证脚本的原子性:
首先需要准备Lua代码: script.lua
---- Created by IntelliJ IDEA.-- User: jifang-- Date: 16/8/24-- Time: 下午6:11 -- local key = "rate.limit:" .. KEYS[1] local limit = tonumber(ARGV[1]) local expire_time = ARGV[2] local is_exists = redis.call("EXISTS", key) if is_exists == 1 then if redis.call("INCR", key) > limit then return 0 else return 1 end else redis.call("SET", key, 1) redis.call("EXPIRE", key, expire_time) return 1 endJava
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能够采用什么样的方式来实现限流"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
脚本
代码
原子
方式
内容
篇文章
网络
传输
事务
价值
优势
兴趣
只需
命令
大部分
客户
客户端
小伙
小伙伴
开销
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
小米移动互联网科技园
广州百单互联网科技有限公司
互联网为科技
互联网科技卖菜
科技类互联网
互联网 科技公司
北京互联网科技有限公司
齐家互联网科技
盛创互联网科技有限公司
成都铂石互联网科技做什么的
港股科技和互联网
互联网科技和法律行业
互联网科技大赛获奖感言
互联网企业科技类企业如何做账
上海同邻互联网科技有限公司规模
万物互联网智能科技
山东蛋芒互联网科技有限公司
互联网科技大会大佬
互联网领先科技成果宣传视频
互联网企业和网络科技有限公司
中关村互联网 科技集团
互联网最新的科技有限公司
互联网科技的
郑州华宇互联网科技
互联网教育科技公司vipkid
互联网和黑科技的看法
知域互联网科技有限公司大骗子
杭州壁岐互联网科技有限公司
深圳互联网科技的发展
长沙易易互联网科技有限公司