Redis应用之限制访问频率

举报
波波烤鸭 发表于 2022/03/30 02:00:11 2022/03/30
【摘要】   我们知道当网站的访问量突然很大的时候肯定会对服务器造成影响,甚至无法访问,如果是正常的访问那么很好说明业务量增大可以考虑系统的扩展,但是如果是搜索引擎爬虫频繁访问或是一些恶意访问,那这时候我们就应该限...

  我们知道当网站的访问量突然很大的时候肯定会对服务器造成影响,甚至无法访问,如果是正常的访问那么很好说明业务量增大可以考虑系统的扩展,但是如果是搜索引擎爬虫频繁访问或是一些恶意访问,那这时候我们就应该限制这些访问的访问次数。redis刚好可以解决这个问题

Redis实现限制访问频率

1.实现访问一

  限制每个用户每分钟最多只能访问100个页面。实现思路:key使用有"rate.limiting:IP",value使用数值,用户每次访问将value的值通过INCR命令自增1.如果自增后的值是1同时设置过期时间为1分钟。这样用户每次访问的时候都读取该键的值,如果超过了100就表明该用户的访问频率超过了限制,需要提示用户稍后访问。且该键每分钟会自动被删除。所以下一分钟又会重新计算,也就达到了限制访问频率的目的。
在这里插入图片描述

代码逻辑:

String key = "rage.limiting:"+ip;
// 判断key是否存在
int flag = exists(key);// key rate.limiting:192.168.88.60
if(flag == 1){
	// key 存在 自增1
    int count = incr(key);
    if(count > 100){
    	// 超过限制
	    log.info("访问频率超过了限制,请稍后重试");
	    return ;
	}
}else{
	// key 不存在 
	multi(); // 开启事务
	incr(key); // key不存在自增1 值为1
	expire(key,60); // 设置过期时间
	exec(); // 提交事务
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.实现方式二

  实现方式一其实还有个问题,比如如果用户第一分钟的访问了99次,前面58秒访问了9次,后面1秒访问了90次,然后用户后一秒也访问了99次,而后一分钟的第一秒访问了90次,后面的58秒访问了9次,这样按照上面的算法是没有问题的,但是这种极端情况大家还是可以发现问题的。
在这里插入图片描述

  解决方法:先将上面案例中的100次调整为10次便于在次场景中描述,要精确的保证同一个用户每分钟最多访问10次,需要记录下来用户每次访问的时间。因此对每个用户我们使用一个List列表类型的键来记录他最近10次访问的时间,一旦键中的元素超过10个,就判断最早的元素距离现在的时间是否小于1分钟。如果是表示用户最近1分钟访问次数超过了10次,如果不是就将现在的时间加入到队列中,同时把最早的元素删除。
在这里插入图片描述

在这里插入图片描述

逻辑代码

String key = "rate.limiting:"+IP;
int listLength = llen(key);
if(listLength < 10){
	lpush(key,new());
}else{
	long time = lindex(key,-1);
	if(now()-time < 60){
		log.info("访问频率超过了限制,请稍后再试");
	}else{
		lpush(key,now);
		ltrim(key,0,9);
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/88614116

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。