策略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访问次数的更多相关文章

  1. 用shell统计访问日志里每个ip访问次数【转】

    今天,要统计一个系统的每个ip访问次数,于是我找到该系统访问日志,并写脚本实现.   访问日志情况: [root@qular ~]# cd /usr/local/nginx/logs/ [root@q ...

  2. 使用python脚本实现统计日志文件中的ip访问次数

    使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...

  3. python统计apache、nginx访问日志IP访问次数并且排序(显示前20条)【转】

    前言:python统计apache.nginx访问日志IP访问次数并且排序(显示前20条).其实用awk+sort等命令可以实现,用awk数组也可以实现,这里只是用python尝试下.   apach ...

  4. 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 ...

  5. 操作文件-取出一个60s内log日志中ip访问次数超过100次的ip

    import timea=0while True: d={} f = open(r"/Users/**juan/Downloads/access.log",encoding=&qu ...

  6. web api 限制单个IP在一定时间内访问次数

    ps:下面实例是每隔30秒访问次数不超过3次 1.Filter: using Infrastructure.Log; using Infrastructure.Web; using Lemon.Sta ...

  7. Python习题-统计日志中访问次数超过限制的IP

    #1.1分钟之内ip访问次数超过200次的,就给他的ip加入黑名单#需求分析: #1.读日志,1分钟读一次 #2.获取这1分钟之内所有访问的ip #3.判断ip出现的次数,如果出现200次,那么就加入 ...

  8. PHP实现redis限制单ip、单用户的访问次数功能

    本文实例讲述了PHP实现redis限制单ip.单用户的访问次数功能.分享给大家供大家参考,具体如下: 有时候我们需要限制一个api或页面访问的频率,例如单ip或单用户一分钟之内只能访问多少次 类似于这 ...

  9. flask-limiter限制单个IP访问的频率和次数

    Flask-Limiter provides rate limiting features to flask routes. It has support for a configurable bac ...

随机推荐

  1. PHP中的Session工作原理

    一直在使用session存储数据,一直没有好好总结一下session的使用方式以及其工作原理,今天在这里做一下梳理. 这里的介绍主要是基于php语言,其他的语言操作可能会有差别,但基本的原理不变. 1 ...

  2. Linux 小知识翻译 - 「日志」(log)

    这次聊聊「日志」. 「日志」主要指系统或者软件留下的「记录」.出自表示「航海日志」的「logbook」. 经常听说「出现问题的时候,或者程序没有安装自己预期的来运行的时候,请看看日志!」. 确实,记录 ...

  3. mybatis中使用Integer类型的参数<if>判断问题

    mybatis对传入参数进行判断时,会使用if标签, 一般是判断不为null和'', 如下: <if test="name != null and 那么 != ''"> ...

  4. IntelliJ IDEA 创建Spring+SpringMVC+mybatis+maven项目

    参考自:https://www.cnblogs.com/hackyo/p/6646051.html 第一步: 创建maven项目 输入项目名和工程id 选择maven 默认就可以了 刚开始时间比较长, ...

  5. #007 C语言大作业学生管理系统第四天

    第四天还差恢复已删除学生功能 对于我来说,已经开始很复杂了. 小细节太重要了,边写边出错 1 #include<stdio.h> #include<stdlib.h> #inc ...

  6. 新近碰到的病毒(TR.Spy.Babonock.A)

    先来段Microsoft的说明: Worm:Win32/Babonock.A Alert level: Severe Detected with Windows Defender Antivirus ...

  7. java继承-super的用法

    继承的特点: 1.子类继承了父类的成员 2.具有层次结构 继承的优点: 1.代码重用 2.父类字段和方法可用于子类 3.从抽象到具体形成类的继承体系 4.可以轻松自定义子类 this:当前对象的引用 ...

  8. Win7 下安装ubuntu14.04双系统

    下面介绍一下利用wubi在Windows中安装Ubuntu 14.04的教程,或者说安装方法和注意事项.  方法一:直接下载wubi.exe 方法二:直接下载ubuntu-14.04-desktop- ...

  9. Django-rest-framework 接口实现 了解 GenericAPIView

    进化写法GenericAPIView 面向对象的封装 将同样的 方法以及对象 封装到一起 将 对数据库相关的 功能封装到一起 GenericAPIView 在 from rest_framework. ...

  10. day 06 元组、字典、集合的定义及其方法

    一:元组 1.定义:在()内用多个逗号分隔开多个任意类型的元素 元组用来记录多个值,当值没有改变的需求时,用元组更合适. 元组是有序的.不可变的(虽然数据不可变,但是数据的数据是可以改变的) t = ...