限定当天的可用次数 redis

该代码实现了一个利用Redis进行限流的工具类,主要功能是在一天内限制二维码生成次数不超过设定值。通过Redis的 incr 操作确保原子性,并根据当前时间设置键的过期时间。当达到指定次数时,会抛出异常阻止进一步生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一个场景: 比如我生成二维码 然后我不能一直让他生成 要做限定次数

解决思路 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次

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新生代农民工-小王八

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值