限定当天的可用次数 redis
有一个场景: 比如我生成二维码 然后我不能一直让他生成 要做限定次数
解决思路 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次