redis的key设置每天凌晨过期的思路

设置key凌晨过期的思路

  1. 设置key的值的时候,计算下当前时间到第二天凌晨的时间差,设置key的过期时间。
  2. 利用定时任务,每天凌晨将需要过期的key删除。

应用场景

  1. 按天为维度,限制用户对资源的访问次数。
  2. 按天为维度,生成递增序列号。

代码示例

    /**
     * 按用户id和天为维度生成递增的单号
     *
     * @return 
     */
   private String createNo(Integer userId) {
        StringBuilder sb = new StringBuilder();
        String dateStr = DateUtils.getDateForFormat(new Date(), "yyyyMMdd");
        sb.append("P").append(dateStr).append(userId);
        String keyPrefix = sb.toString();
        long keySuffix = jedis.incr(keyPrefix);
        if (keySuffix > Constant.NO_MAXVALUE_999) {
            log.error("生成单号失败,序号大于999,userId:" + userId);
            throw new RuntimeException("生成预约单号失败,序号大于999");
        }
        Long expiresTime = getSecondsNextEarlyMorning();
        jedis.setExpire(keyPrefix, expiresTime.intValue());
        String keySuffixStr = String.format("%03d", keySuffix);
        return keyPrefix + keySuffixStr;
    }
    
    /**
     * 判断当前时间距离第二天凌晨的秒数
     *
     * @return 返回值单位为[s:秒]
     */
    public Long getSecondsNextEarlyMorning() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
    }

 

posted @ 2019-05-07 20:42  二叉树的博客  阅读(14966)  评论(1编辑  收藏  举报