前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一种基于Redis的10行代码实现IP频率控制方法

一种基于Redis的10行代码实现IP频率控制方法

作者头像
一见
发布2018-08-02 10:25:13
5600
发布2018-08-02 10:25:13
举报
文章被收录于专栏:蓝天

优点:可支持海量访问的频率控制,只需要增加Redis机器,单个Redis节点(只占用一个cpu core)即可支持10万/s以上的处理。 基于IP频率限制是种常见需求,基于Redis可以十分简单实现对IP的频率限制,具体手段为利用Redis的key过期和原子加减两个特性。 以IP作为key,频率为key过期时长,比如限制单个IP在2秒内频率为100,则key过期时长为2秒,基于r3c(a Redis Cluster C++ Client)的实现大致如下:

代码语言:javascript
复制
 r3c::CRedisClient redis("127.0.0.1:6379,127.0.0.1:6380");
  
 int ret = redis.incrby(ip, 1);
 
 if (ret > 1000) // 超过频率
 
 { 
 
 }
 
 else // 访问放行
 
 { 
 
 if (1 == ret)
 
 			        redis.expire(ip, 2); // 频率控制为2秒内1000次访问 
 
 } 

完整示例:

代码语言:javascript
复制
 // https://github.com/eyjian/r3c
  
 			#include <r3c/r3c.h>
 
 
 
 int main()
 
 {
 
 			    std::string ip = "127.0.0.1";
 
 			    r3c::CRedisClient redis("10.223.25.102:6379");
 
 			    r3c::set_debug_log_write(NULL);
 
 for (int i=0; i<100000; ++i)
 
 { 
 
 			        // r3c基于redis的EVAL命令提供了一个带过期参数的incrby,
         // 这样避免了两次操作的非原子时expire调用可能不成功问题。
 
 int ret = redis.incrby(ip, 1);
 
 if (ret > 1000) // 限制单个IP每2秒最多访问1000次
 
 {
 
 			            printf("[OVER] 超过频率,限制访问\n");
 
 }
 
 else
 
 {
 
 if (1 == ret)
 
 {
 
 			                redis.expire(ip, 2); // 频率设定为2秒
 
 			                printf("[FIRST] 第一次,访问放行\n");
 
 }
 
 else
 
 {
 
 			                printf("[OK] 访问放行\n");
 
 }
 
 }
 
 }
 
 			    redis.del(ip);
 
 			    return 0;
 
 } 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/09/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档