有一个场景: 比如我生成二维码 然后我不能一直让他生成 要做限定次数
解决思路 redis 记录一天生成次数 如果超过了就不让他生成
代码实现:
/**工具类注入bean
* @author zhangjunrong
* @date 2022/2/22 19:30
*/
@Autowired
private RedisUtil redisUtil;
private static ConvenientUtil convenientUtil ;
@PostConstruct
public void init() {
convenientUtil = this;
convenientUtil.redisUtil= this.redisUtil;
}
/**
*计数当前时间到当天最后时间 的间隔时间差
* @param unit 计数时间类型 DateUnit.SECOND 秒
* @return long
* @author zhangjunrong
* @date 2022/5/11 18:37
*/
public static long countEndTime(DateUnit unit){
DateTime time = DateUtil.date();
Date beginOfDay = DateUtil.endOfDay(time);
long betweenDay = DateUtil.between(time, beginOfDay, unit);
return betweenDay;
}
/**
*次数限定 递增
* @param redisKey
* @param number
* @return void
* @author zhangjunrong
* @date 2022/5/11 13:55
*/
public static void limitedNumber(String redisKey,Integer number){
//为了防止并发和重复 使用递增
//如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作
//限制次数 当天为期限 不可超过 number次
Integer useNumber = (Integer) convenientUtil.redisUtil.get(redisKey);
if (ObjectUtil.isEmpty(useNumber)){
//如果为空 则直接放置数量一
convenientUtil.redisUtil.incr(redisKey,SystemConstant.NUM_ONE);
//设置有效期当天有效
convenientUtil.redisUtil.expire(redisKey,countEndTime(DateUnit.SECOND));
}else {
//获取已发送次数
//发送次数大于number次 当天内停止在发验证码
if (useNumber>=number) {
throw new YqsException(MessageEnum.AUTH_CODE_ERR.getCode(), "使用次数已用完");
}else {
//redis已存在 则++size
convenientUtil.redisUtil.incr(redisKey,SystemConstant.NUM_ONE);
//设置有效期当天有效
convenientUtil.redisUtil.expire(redisKey,countEndTime(DateUnit.SECOND));
}
}
}
结果:
我们限定他一天只可用20次