目录
前言:
一个秒杀活动:具有很鲜明的业务需求。我们抛开丢弃策略、限流、防刷、并发、降级、削峰、队列泄洪、验证码、隔离等等手段不谈。这些会在闲暇的时候会慢慢整理下。
今天讨论下判断当前活动是否被开启。是否进入秒杀或者是否结束秒杀
假设我们实现了以上种种没有在这篇文章中所谈论的技术。极端假设下:100W的用户访问量 --> 最终进入到实际业务中只有100个请求在能够控制的范围中。下面我们要对进入到实际业务中的请求进行判断。
秒杀活动需求:
秒杀活动每天8:00开始12:00结束,持续3天。 时间从 2019-08-20 - 2019-08-22
实际业务代码:
1、从mysql或者redis中获取到活动持续的时间:进行简单的判断当前时间是否在活动时间,由于使用了redis。所以这个过程会比较快的。(redis的超时时间是一个比较巧妙的办法)
2、得到活动的开启和关闭时间(8:00和12:00)之后。我们要对当前时间进行判断。见代码
package com.bz.mall.utils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.StringUtils;
import com.hhz.basic.util.common.IntervalUtil;
/**
* csdn时间工具类demo
* @author liren
*
*/
public class DateUtils {
/**
* 判断当前时间是否在 区间内 (精确到毫秒值)
* @param sTime 开始区间 HH:mm:ss
* @param eTime 结束区间 HH:mm:ss
* @return
* @author liren
*/
public static boolean JudgeTime(String sTime, String eTime) {
long now = System.currentTimeMillis();
String shortNow = "";
String judge = "";
boolean flag = false;
try {
// 当前时间 -> yyyy-MM-dd
String dateShort = DateUtils.getDateShort(now);
String sDate = String.valueOf(DateUtils.StrToLong(dateShort + " " + sTime));
String eDate = String.valueOf(DateUtils.StrToLong(dateShort + " " + eTime));
shortNow = String.valueOf(now);
judge = "[" + sDate + "," + eDate + "]";
// IntervalUtil.isInTheInterval工具类,详情请见:https://blog.csdn.net/qq_26465035/article/details/98626346
flag = IntervalUtil.isInTheInterval(shortNow, judge);
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 获取当前时间的年月日
* @param ctime
* @return
* @author liren
*/
public static String getDateShort(long ctime){
if(ctime<=0){
return "";
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
return format.format(new Date(ctime)).toString();
}
/**
* 字符串 转时间戳 : yyyy-MM-dd HH:mm:ss --> 时间戳
* @return
* @throws ParseException
* @author liren
*/
public static long StrToLong(String str) {
Date date = null;
long ts = 0;
if (StringUtils.isNotEmpty(str)) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
date = df.parse(str);
ts = date.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
}
return ts;
}
}