zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    Anaconda使用命令
    排序算法3--插入排序--希尔排序(缩小增量排序)
    排序算法2--插入排序--折半插入排序
    排序算法1--插入排序--直接插入排序
    排序总结---常用的排序算法总结,java和js实现
    前端兼容性问题
    js对象的几种创建方式和js实现继承的方式[转]
    js原型和原型链[转]
    性能优化的方法
    Http状态码
  • 原文地址:https://www.cnblogs.com/luao/p/10827939.html
Copyright © 2011-2022 走看看