最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

世界资讯:redis实现用户查询次数限制

来源:博客园


(相关资料图)

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

具体实现思路是使用Redis的特性存储,计算每个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地址作为Keyelse {    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;以上是完整实现代码,如有不足欢迎大家补充

关键词: 剩余次数 时间常量 层出不穷的