Redis小案例(一):实现网站访问频率限制
2017-12-03 17:11
981 查看
网站中经常需要用到网站限流,例如限制用户恶意爬虫获取网页信息以及在网站访问流量大时限制访问频率等等,这里使用redis做一个简单的网站登录限制案例。
原文链接:Redis小案例(一):实现网站访问频率限制
测试,在网页中输入
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/dac6586c2ba5dd7ab9a0eb98f8de336a.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/fd07aae101b902b495bd58a16c322a46.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/a11dc751a68c8a6e03de13604254a865.png)
当第三次刷新也就是第四次访问时,页面会返回错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/d982768151de8f855aa17ee731df990f.png)
此时可以使用列表来完善这个功能:当用户访问次数小于三次时,把当前访问时间插入列表,让用户正常访问。大于三次时,提取出第一次访问和当前时间进行比较,如果时间间隔小于规定时间,返回错误,否则,删掉第一个记录,并插入新的纪录在最后。
修改上面
测试,正常访问:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/45bb8f98a6155d4bc81b67fa79ff19d2.png)
一旦任何
原文链接:Redis小案例(一):实现网站访问频率限制
一、使用EXPIRE进行访问频率限制
逻辑:用户登入网页,判断是否为第一次登入,如果是,创建一个新键记录访问次数为1,并设置超时时间。后面再登入时先判断键是否存在且大于访问次数限制,如果是的话,返回错误,否则就把访问次数+1,返回正常页面。# -*- coding: utf8 -*- import web import redis """ LIMIT_TIME:在多长的时间范围内 LIMIT_TIMES:最多访问多少次 """ LIMIT_TIMES = 3 LIMIT_TIME = 60 conn = redis.StrictRedis() """ 路由处理 """ urls = ( "/", "Index" ) class Index: @staticmethod def __mk_h1(data): return "<title>HelloWorld</title><div align=center><h1>%s</h1></div>" % data def __not_first_visit(self, key_name, user): """ 第一次访问时的操作 :return: 返回网页内容 """ # 键值存在,获取数量 n = int(conn.get(key_name)) print key_name, n if n >= LIMIT_TIMES: # 如果数量超过指定限制,返回错误 return self.__mk_h1("Error") else: # 返回正常的页面 conn.incr(key_name) return self.__mk_h1("Hello %s! This is you %d visit!" % (user, n + 1)) def __first_visit(self, key_name, user): """ 非第一次访问的操作 :return: 返回网页内容 """ # 键不存在,创建新键 pipe = conn.pipeline() pipe.incr(key_name) pipe.expire(key_name, LIMIT_TIME) pipe.execute() return self.__mk_h1("Hello %s, This is you first visit!" % user) def GET(self): """ 处理用户请求 """ params = web.input() if "user" not in params: return self.__mk_h1("Who are you") else: user = params["user"] key_name = "login:times:%s" % params["user"] if conn.exists(key_name) is True: return self.__not_first_visit(key_name, user) else: return self.__first_visit(key_name, user) if __name__ == "__main__": app = web.application(urls, globals()) app.run()
测试,在网页中输入
http://127.0.0.1:8080?user=maqian,并刷新三次:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/dac6586c2ba5dd7ab9a0eb98f8de336a.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/fd07aae101b902b495bd58a16c322a46.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/a11dc751a68c8a6e03de13604254a865.png)
当第三次刷新也就是第四次访问时,页面会返回错误:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/d982768151de8f855aa17ee731df990f.png)
二、使用列表限制登陆频率
使用上面的方法有一个问题,假设用户在某一分钟的第一秒访问了一次,然后在最后一秒访问两次,此时进入第二秒,用户又立马访问两次,根据上面的规则,这两次访问是可以正常访问的,但是这样就导致用户在两秒内访问了4次,和我们的要求不符。此时可以使用列表来完善这个功能:当用户访问次数小于三次时,把当前访问时间插入列表,让用户正常访问。大于三次时,提取出第一次访问和当前时间进行比较,如果时间间隔小于规定时间,返回错误,否则,删掉第一个记录,并插入新的纪录在最后。
修改上面
Index类代码为:
class Index: @staticmethod def __mk_h1(data): return "<title>HelloWorld</title><div align=center><h1>%s</h1></div>" % data def __visit(self, key_name): n = int(conn.llen(key_name)) if n < LIMIT_TIMES: conn.lpush(key_name, time.time()) return self.__mk_h1("Hello!") else: now = time.time() t = float(conn.lrange(key_name, 2, 2)[0]) print now, t, now - t if time.time() - t <= LIMIT_TIME: return self.__mk_h1("Error") else: # 弹出最右边的元素,即最先被插进来的元素 conn.rpop(key_name) # 插入 b1ef 元素 conn.lpush(key_name, now) return self.__mk_h1("Hello") def GET(self): """ 处理用户请求 """ params = web.input() if "user" not in params: return self.__mk_h1("Who are you") else: user = params["user"] key_name = "login:times:%s" % user return self.__visit(key_name)
测试,正常访问:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/45bb8f98a6155d4bc81b67fa79ff19d2.png)
一旦任何
20S内访问次数超过三次,返回错误页面:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/01/08d282369c7fdc4afc009539542ac8db.png)
相关文章推荐
- 用redis实现API访问频率的限制
- Java通过redis实现接口ip访问频率限制
- 124.115.0的IP段访问频繁造成网站空间负载过荷:限制搜搜蜘蛛抓取频率的参考方法
- 轻型的接口访问频率限制服务模型的设计与实现【转】
- Django 限制用户访问频率的中间件的实现
- 在nginx中实现单位时间内限制访问频率的教程
- [SpringMVC+redis]自定义aop注解实现控制器访问次数限制
- 由“ASP.NET网站限制访问频率”想到的两点问题(转)
- 0140 redis实现访问频次限制的几种方式
- Redis简单案例(二) 网站最近的访问用户
- nginx lua redis 访问频率限制(转)
- ASP.NET网站限制访问频率
- redis实现访问频次限制的几种方式
- ASP.NET网站限制访问频率
- 【转载】ASP.NET网站限制访问频率
- 网站的访问ip中找出进行频繁连接的ip,并对这些ip的访问频率进行限制。
- PHP中Yii2框架用redis实现限制接口访问次数
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 访问频率限制功能实现、防止黑客扫描、防止恶意刷屏
- ASP.NET网站限制访问频率
- redis实现访问限制