程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 一種基於Redis的10行代碼實現IP頻率控制方法

一種基於Redis的10行代碼實現IP頻率控制方法

編輯:關於PHP編程

一種基於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)的實現大致如下:

  1. r3c::CRedisClient redis("127.0.0.1:6379,127.0.0.1:6380");
  2. int ret = redis.incrby(ip, 1);
  3. if (ret > 1000) // 超過頻率
  4. {
  5. }
  6. else // 訪問放行
  7. {
  8. if (1 == ret)
  9. redis.expire(ip, 2); // 頻率控制為2秒內1000次訪問
  10. }

完整示例:

  1. // https://github.com/eyjian/r3c
  2. #include

  3. int main()
  4. {
  5. std::string ip = "127.0.0.1";
  6. r3c::CRedisClient redis("10.223.25.102:6379");
  7. r3c::set_debug_log_write(NULL);
  8. for (int i=0; i<100000; ++i)
  9. {
  10. int ret = redis.incrby(ip, 1);
  11. if (ret > 1000) // 限制單個IP每2秒最多訪問1000次
  12. {
  13. printf("[OVER] 超過頻率,限制訪問\n");
  14. }
  15. else
  16. {
  17. if (1 == ret)
  18. {
  19. redis.expire(ip, 2); // 頻率設定為2秒
  20. printf("[FIRST] 第一次,訪問放行\n");
  21. }
  22. else
  23. {
  24. printf("[OK] 訪問放行\n");
  25. }
  26. }
  27. }
  28. redis.del(ip);
  29. return 0;
  30. }



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved