一種基於Redis的10行代碼實現IP頻率控制方法
優點:可支持海量訪問的頻率控制,只需要增加Redis機器,單個Redis節點(只占用一個cpu core)即可支持6萬/s以上的處理。
基於IP頻率限制是種常見需求,基於Redis可以十分簡單實現對IP的頻率限制,具體手段為利用Redis的key過期和原子加減兩個特性。
以IP作為key,頻率為key過期時長,比如限制單個IP在2秒內頻率為100,則key過期時長為2秒,基於r3c(a Redis Cluster C++ Client)的實現大致如下:
- 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次訪問
- }
完整示例:
- // https://github.com/eyjian/r3c
- #include
- 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)
- {
- 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;
- }