方法1:
把用户的名称作为key,使用redis的incr(key)命令、设置key的失效时间expire(key,1, TimeUnit.MINUTES),每次访问调用该方法一次;根据返回值 进行限流;
redis> SET mykey "1"
OK
redis> INCR mykey
(integer) 2
redis> GET mykey
"2"
redis>
方法2:
使用有序集合(sorted set) ;
1.用户每次访问时服务器时,调用ZADD(KEY_NAME,SCORE,VALUE)方法;KEY_NAME为用户名称,SCORE为当前时间,VALUE可以随意设置;
2.使用zremrangeByScore(KEY_NAME,0,currentTime-limitTime*1000)命令,排除超过100s限流时间范围外的数据;
3.再使用zcard(KEY_NAME)统计该用户在100s限流时间范围内的总条数;
4.统计的结果与限流值进行比较;
5.设置expire(KEY_NAME,101s),如果KEY_NAME超过100s限流时间范围外失效;(如果数据没被移除,则自动失效)
redis 127.0.0.1:6379> ZADD salary 2000 "tom"
integer) 1
redis 127.0.0.1:6379> ZADD salary 3500 "peter"
integer) 1
redis 127.0.0.1:6379> ZADD salary 5000 "jack"
integer) 1
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 显示有序集内所有成员及其 score 值
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"
redis 127.0.0.1:6379> ZREMRANGEBYSCORE salary 1500 3500 # 移除所有薪水在 1500 到 3500 内的员工
(integer) 2
redis> ZRANGE salary 0 -1 WITHSCORES # 剩下的有序集成员
1) "jack"
2) "5000"