zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

redis实现用户查询次数限制

2023-03-31 10:36:26 时间

  随着项目的开发越来越完善,产品也会提出各种层出不穷的需求,当一个复杂列表查询功能实现时,需求又说要增加用户的查询次数限制,这就让开发很是头疼,但是为了RMB也就忍忍了!

具体实现思路是使用Redis的<key,value>特性存储,计算每个key的访问次数,然后递减代码如下:

 

一、定义访问次数和过期时间常量

private static final int TIME_INTERVAL = 1440;
private static final int FAILED_RETRY_TIMES = 4;

二、判断用户是否是登录状态?

登录则获取用户Id
String key = "";
boolean flag = false;
Long userId = SecurityUtils.getCurrUserId();
if (userId != null) {
CoCompanyInfo coCompanyInfo = coCompanyInfoMapper.selectMyCoCompanyInfoByTenantId(SecurityUtils.getCurrTenantId());
if (coCompanyInfo == null){
key = userId.toString();
}else {
flag = true;
}
}
未登录或者未注册的用户则取IP地址作为Key
else {
HttpServletRequest request = ServletUtils.getRequest();
String ip = IpUtils.getIP(request);
log.info("获取客户端的IP地址为:" + ip);
key = ip;
}

 

三、redisTemplate方法根据key获取到value

if (StringUtils.isNotEmpty(key)){
Integer value = (Integer) redisTemplate.opsForValue().get(key);
if (value != null){
//剩余次数大于零且数组不等于空时,查询次数减一
if (value > 0 && CollectionUtils.isNotEmpty(list)){
redisTemplate.boundValueOps(key).increment(-1);
flag = true;
}else {
flag = false;
}
}
如果key等于空则是第一次访问,则存入次数和时间
else {
redisTemplate.opsForValue().set(key, FAILED_RETRY_TIMES, TIME_INTERVAL, TimeUnit.MINUTES);
flag = true;
}
}

四、如果flag = false则登录次数已用完,返回空数组
if (flag == false){
return new ArrayList<>();
}
return list;

以上是完整实现代码,如有不足欢迎大家补充