怎么使用redis做次数的限制
目录笔者在实际开发中,总能遇到一些 对验证次数的限制,比如 验证身份证这种api ,由于是收费的,为了防止恶意的提交身份证,所以 限制住是很重要的,分布式的系统中要么用 zookeeper ,要么redis ,这种没必要使用数据库去实现,具体实现@Overridepublic Map<String, Object> validateThreeElement...
·
目录
笔者在实际开发中,总能遇到一些 对验证次数的限制,比如 验证身份证这种api ,由于是收费的,为了防止恶意的提交身份证,所以 限制住是很重要的,分布式的系统中要么用 zookeeper ,要么redis ,这种没必要使用数据库去实现,
具体实现
@Override
public Map<String, Object> validateThreeElementByRisk(ApplyAuthReq applyAuth,String idkey) throws RequestException {
if(!tDataDictService.judgeIdCardSum(idkey,Constants.INT_1)){
throw new RequestException(ResCode.PAGE_LOAD_CLOSE.getCode(),"认证次数已达上限,请明天再试");
}
Object resJson=HttpUtil.getObjectById(id);
if (resJson != null && "200".equals(resJson.getString("code"))) {
}else if(resultJson.equals(Constants.INT_2)){
throw new RequestException(ResCode.PAGE_LOAD_CLOSE.getCode(),"审核拒绝,不符合申请条件");
}else{
tDataDictService.subIdCardSum(idkey,Constants.INT_2);
throw new RequestException(ResCode.PAGE_LOAD_CLOSE_WIND.getCode(),"身份信息不一致,请核对信息后再试");
}
}
}
首先 已进入方法时,马上判断 这个 id 是否 有 达到 3次的限制
public boolean judgeIdCardSum(String id) {
//判断是否包含某个Key
String key=Constants.INSTALLMENT_KEY +Constants.ID_CARD_SUM+id+"_"+ DateUtils.formatStr6Date(new Date(),DateUtils.DATE_PATTON_3);
boolean flag = jedisTemplate.KEYS.exists(key);
if (!flag) {
//不存在就是 第一次验证,那么就可以 设置一个过期时间和次数
long exprieTme = 86400 - org.apache.commons.lang.time.DateUtils.getFragmentInSeconds(Calendar.getInstance(), Calendar.DATE);
jedisTemplate.STRINGS.setEx(key, (int)exprieTme, Constants.INT_3);
return true;
} else {
// 存在就 需要判断次数是否是0,不为0,则减1
String idValueStr = jedisTemplate.STRINGS.get(key);
if(idValueStr.equals(Constants.INT_0)){ //0 代表该天的次数用完
return false;
}else{
return true;
}
}
}
使用redis做限制的具体
当发生不符合的时候,实时给 redis对应的key -1
public boolean subIdCardSum(String id) {
//判断是否包含某个Key
String key=Constants.INSTALLMENT_KEY +Constants.ID_CARD_SUM+id+"_"+ DateUtils.formatStr6Date(new Date(),DateUtils.DATE_PATTON_3);
boolean flag = jedisTemplate.KEYS.exists(key);
if (!flag) {
//不存在就是 第一次验证,那么就可以 设置一个过期时间和次数
long exprieTme = 86400 - org.apache.commons.lang.time.DateUtils.getFragmentInSeconds(Calendar.getInstance(), Calendar.DATE);
jedisTemplate.STRINGS.setEx(key, (int)exprieTme, Constants.INT_3);
return true;
} else {
// 存在就 需要判断次数是否是0,不为0,则减1
String idValueStr = jedisTemplate.STRINGS.get(key);
if(idValueStr.equals(Constants.INT_0)){ //0 代表该天的次数用完
return false;
}else{
String newValue= String.valueOf(Integer.valueOf(idValueStr)-1);
jedisTemplate.STRINGS.set(key, newValue);
return true;
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)