使用redis限制ip访问次数
策略1:
在redis中保存一个count值(int),key为user:$ip,value为该ip访问的次数,第一次设置key的时候,设置expires。
count加1之前,判断是否key是否存在,不存在的话,有两种情况:1、该ip未访问过;2、该ip访问过,但是key已经过期了。那么此时需要再次设置一次expires。
如果用户访问的时候,判断count的值是否大于上限,如果低于上限,就处理请求,否则就拒绝处理请求。
策略2:
考虑这种情况,假设只允许用户60秒内访问100次,如果有一个用户在第1秒访问了1次,在第59秒的时候,访问了99次,然后在第61秒的时候,访问了100次。
如果按照策略1的情况处理,第1~60秒之间接受了100次,在第61秒接收100次请求,所以62~120这段时间内,不再处理该ip的请求。
貌似没问题,但是,细细思考一下,第59秒到61秒之间接受了99+100=199请求,时间间隔只有3秒。那么这样的话,最初的设计就存在问题了。
解决方案:可以使用redis的list(双向队列)数据结构,key就是user:$ip,也就是每一个ip设置一个双向队列,每次请求到达的时候,进行如下判断:
1、如果list中的元素个数少于100个,那么就将请求到达时的时间戳Lpush到list中。
2、如果list中的元素多余100个,那么,就取出Lindex(-1)即最右边,也就是100个请求中最早的那一个请求的时间戳,如果最早的时间戳和当前时间戳相差超过60秒,那么表示第一个请求已经过期了,就将第一个请求出队Rpop。然后将当前时间戳入队Lpush。
使用redis限制ip访问次数的更多相关文章
- 用shell统计访问日志里每个ip访问次数【转】
今天,要统计一个系统的每个ip访问次数,于是我找到该系统访问日志,并写脚本实现. 访问日志情况: [root@qular ~]# cd /usr/local/nginx/logs/ [root@q ...
- 使用python脚本实现统计日志文件中的ip访问次数
使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...
- python统计apache、nginx访问日志IP访问次数并且排序(显示前20条)【转】
前言:python统计apache.nginx访问日志IP访问次数并且排序(显示前20条).其实用awk+sort等命令可以实现,用awk数组也可以实现,这里只是用python尝试下. apach ...
- redis 指定IP访问
配置IPTABLES -A INPUT -s 10.100.0.5 -p tcp --dport 6379 -j ACCEPT -A INPUT -s 10.100.0.219 -p tcp --dp ...
- 操作文件-取出一个60s内log日志中ip访问次数超过100次的ip
import timea=0while True: d={} f = open(r"/Users/**juan/Downloads/access.log",encoding=&qu ...
- web api 限制单个IP在一定时间内访问次数
ps:下面实例是每隔30秒访问次数不超过3次 1.Filter: using Infrastructure.Log; using Infrastructure.Web; using Lemon.Sta ...
- Python习题-统计日志中访问次数超过限制的IP
#1.1分钟之内ip访问次数超过200次的,就给他的ip加入黑名单#需求分析: #1.读日志,1分钟读一次 #2.获取这1分钟之内所有访问的ip #3.判断ip出现的次数,如果出现200次,那么就加入 ...
- PHP实现redis限制单ip、单用户的访问次数功能
本文实例讲述了PHP实现redis限制单ip.单用户的访问次数功能.分享给大家供大家参考,具体如下: 有时候我们需要限制一个api或页面访问的频率,例如单ip或单用户一分钟之内只能访问多少次 类似于这 ...
- flask-limiter限制单个IP访问的频率和次数
Flask-Limiter provides rate limiting features to flask routes. It has support for a configurable bac ...
随机推荐
- php循环删除checkbox
一.首先要了解sql语句$SQL=delete from `user` where id in (1,2,4); 表单大概是:form action= method=post input name=I ...
- zabbix 添加自动发现端口并监控
最近在部署zabbix监控 有些服务器上开启的服务端口非常多 如果一个个添加监控会很繁琐,于是想到了自动发现规则 自动发现服务器上的服务端口并进行监控. 在zabbix客户端服务器上进行操作 1 ...
- Linux下编译安装redis
redis是开源,BSD许可,高级的key-value存储系统,可以用来存储字符串,哈希结构,链表,集合,因此,常用来提供数据结构服务. redis和memcached相比的独特之处: 1: redi ...
- puppet使用 apache passsenger 作为前端 (debian)
目录 1. 概要 2. nginx + passenger 配置 2.1. package 安装 2.2. 配置文件设置 2.3. 测试配置结果 2.4. 参考网址 概要 之前做过 apache + ...
- 【Teradata】配置PE和AMP(congfig和reconfig工具、vprocmanager)
The Reconfiguration and Configuration utilities are used to define the AMPs and PEs that operate tog ...
- Docker容器资源管理
本文作者是Red Hat的软件工程师 - Marek Goldmann,这篇文章详细介绍了Docker容器的资源管理,总共分了三大部分:CPU.内存以及磁盘IO.作者通过实践举例给读者勾勒出一幅清晰明 ...
- (转)Spring Boot 2 (四):使用 Docker 部署 Spring Boot
http://www.ityouknow.com/springboot/2018/03/19/spring-boot-docker.html Docker 技术发展为微服务落地提供了更加便利的环境,使 ...
- PHP程序员遇到职业问题时,是离职?还是坚持?
PHP程序员遇到职业问题时,是离职?还是坚持? 初级php程序员最担心在公司里遇到原本其他程序员开发的项目,他们“跑路”以后的工作就由新程序员完成.而新员工也不懂内部的逻辑,酱紫让程序员很难处理后续的 ...
- [matlab] 3.矩阵
matlab矩阵运算很强大 ,几乎所有涉及矩阵运算的命令都有. 事实上,matlab里面所有变量都是以矩阵的形式保存下来的. %% >> x=[1:2.1:10] x = 1.0000 ...
- VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)
目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...