redis的key设置每天凌晨过期的思路
设置key凌晨过期的思路
- 设置key的值的时候,计算下当前时间到第二天凌晨的时间差,设置key的过期时间。
- 利用定时任务,每天凌晨将需要过期的key删除。
应用场景
- 按天为维度,限制用户对资源的访问次数。
- 按天为维度,生成递增序列号。
代码示例
/** * 按用户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; }
不积跬步,无以至千里;不积小流,无以成江海。