代码逻辑:
String key = "rage.limiting:"+ip;// 判断key是否存在int flag = exists(key);// key rate.limiting:192.168.88.60if(flag == 1){// key 存在 自增1 int count = incr(key); if(count > 100){ // 超过限定 log.info("访问频率超过了限定,请稍后重试"); return ;}}else{// key 不存在 multi(); // 开缘由务incr(key); // key不存在自增1 值为1expire(key,60); // 设置过期韶光exec(); // 提交事务}
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);}}