redis能够采用什么样的方式来实现限流
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,这篇文章主要介绍redis能够采用什么样的方式来实现限流,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!目的:实现访问频率限制实现访问者 $ip 在一定的时间 $time 内只能
千家信息网最后更新 2025年02月03日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 end
Java
private boolean accessLimit(String ip, int limit, int timeout, Jedis connection) throws IOException { Listkeys = 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安全错误
数据库的锁怎样保障安全
网络安全教育ppt前言
江津数据库
西南大学数据库
cors系统数据库
软件开发需求填写表
陆良有游戏软件开发公司吗
关系数据库中关键帧
网络安全网法个人怎么做
之家网络技术有限公司怎么样
oracle数据库cmd
哔咔漫画服务器在哪里
软件开发接私活容易吗
创建数据库必须有的文件
带有网络安全的句子英文
plc软件开发框架
软件开发属不属于制造业
网络安全作文 800字
决胜高考网络技术类
暴风电视网络安全吗
获取网页数据库地址
tbc其他材料的任务数据库
服务器换硬盘后开不了机
党政机关网络安全问题
软件开发计划书 大学生
西城区数据网络技术哪家好
廊坊分布式服务器价格
数据库表格只打印第一列
手机版我的世界狼人杀服务器
跨境荟互联网科技有限公司
国风网络技术有限公司电话