|
@ -30,6 +30,7 @@ public class RedisRateLimitStorage extends AbstractRateLimitStorage {
|
|
private Logger logger = LoggerFactory.getLogger(RedisRateLimitStorage.class);
|
|
private Logger logger = LoggerFactory.getLogger(RedisRateLimitStorage.class);
|
|
private static String redisPre = "router:rateLimit:";
|
|
private static String redisPre = "router:rateLimit:";
|
|
private static String redisPreCount = "router:rateLimitCount:";
|
|
private static String redisPreCount = "router:rateLimitCount:";
|
|
|
|
private static String and = ":";
|
|
|
|
|
|
private StringRedisTemplate redisTemplate;
|
|
private StringRedisTemplate redisTemplate;
|
|
|
|
|
|
@ -101,10 +102,10 @@ public class RedisRateLimitStorage extends AbstractRateLimitStorage {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Boolean countDec(String id) {
|
|
|
|
|
|
public Boolean countDec(String id, String requestIP) {
|
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
try {
|
|
try {
|
|
String key = redisPreCount + id;
|
|
|
|
|
|
String key = redisPreCount + id + and + requestIP;
|
|
if (redisTemplate.hasKey(key)) {
|
|
if (redisTemplate.hasKey(key)) {
|
|
redisTemplate.watch(key);
|
|
redisTemplate.watch(key);
|
|
String value = redisTemplate.opsForValue().get(key);
|
|
String value = redisTemplate.opsForValue().get(key);
|
|
@ -122,7 +123,7 @@ public class RedisRateLimitStorage extends AbstractRateLimitStorage {
|
|
Date endTime = simpleDateFormat.parse(rateLimitCount.getEndTime());
|
|
Date endTime = simpleDateFormat.parse(rateLimitCount.getEndTime());
|
|
if (new Date().after(endTime)) {
|
|
if (new Date().after(endTime)) {
|
|
redisTemplate.delete(key);
|
|
redisTemplate.delete(key);
|
|
}else{
|
|
|
|
|
|
} else {
|
|
redisTemplate.expireAt(key, endTime);
|
|
redisTemplate.expireAt(key, endTime);
|
|
}
|
|
}
|
|
} catch (ParseException e) {
|
|
} catch (ParseException e) {
|
|
@ -160,16 +161,16 @@ public class RedisRateLimitStorage extends AbstractRateLimitStorage {
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public Integer getCount(String id) {
|
|
|
|
|
|
public Integer getCount(String id, String requestIp) {
|
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
String key = redisPreCount + id;
|
|
|
|
|
|
String key = redisPreCount + id + and + requestIp;
|
|
String value = redisTemplate.opsForValue().get(key);
|
|
String value = redisTemplate.opsForValue().get(key);
|
|
RateLimitCount rateLimitCount = JSON.parseObject(value, RateLimitCount.class);
|
|
RateLimitCount rateLimitCount = JSON.parseObject(value, RateLimitCount.class);
|
|
try {
|
|
try {
|
|
Date endTime = simpleDateFormat.parse(rateLimitCount.getEndTime());
|
|
Date endTime = simpleDateFormat.parse(rateLimitCount.getEndTime());
|
|
if (new Date().after(endTime)) {
|
|
if (new Date().after(endTime)) {
|
|
redisTemplate.delete(key);
|
|
redisTemplate.delete(key);
|
|
}else{
|
|
|
|
|
|
} else {
|
|
redisTemplate.expireAt(key, endTime);
|
|
redisTemplate.expireAt(key, endTime);
|
|
}
|
|
}
|
|
} catch (ParseException e) {
|
|
} catch (ParseException e) {
|
|
@ -183,13 +184,13 @@ public class RedisRateLimitStorage extends AbstractRateLimitStorage {
|
|
* @return true 返回时已经达到上限 false表示没有
|
|
* @return true 返回时已经达到上限 false表示没有
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public Boolean isUpperLimit(String id) {
|
|
|
|
|
|
public Boolean isUpperLimit(String id, String requestIp) {
|
|
//不存在key的时候默认是可以的
|
|
//不存在key的时候默认是可以的
|
|
String key = redisPreCount + id;
|
|
|
|
|
|
String key = redisPreCount + id + and + requestIp;
|
|
if (!redisTemplate.hasKey(key)) {
|
|
if (!redisTemplate.hasKey(key)) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
return getCount(id) == 0 ? true : false;
|
|
|
|
|
|
return getCount(id,requestIp) == 0 ? true : false;
|
|
}
|
|
}
|
|
|
|
|
|
public StringRedisTemplate getRedisTemplate() {
|
|
public StringRedisTemplate getRedisTemplate() {
|