1、秒杀商品的添加:
通过后台将秒杀商品添加到秒杀表里面,设置好秒杀时间跟周期,包括状态,状态有待发布,已发布,已取消。还有秒杀商品的详情表,库存,每个人可以秒杀的数量,对应秒杀商品的id,秒杀开始,秒杀结束的时间,还包括状态待秒杀,秒杀中,秒杀结束。
2、秒杀商品的发布:
发布秒杀商品通过springBoot的定时任务每天晚上凌晨定时扫描表,查询出后两天的秒杀商品,然后存储到Redis中,存储可能存在集群多线程 *** 作来发布秒杀,做了添加到Redis中的成功还是失败判断,添加数据到Redis是有返回值Boolean,然后再通过redssion的信号量做了分布式锁来作为数量的记录。这里还要修改秒杀商品的状态为已发布,如果保存信号量失败,还要从Redis中删除商品。这里存储商品数据到Redis是通过hash结构,以一个常量作为大key,秒杀商品的id作为小key,商品的信息作为value
演示代码:
domain
/**
* @author lyq-yyds
*/
@TableName("t_kill_course")
@Data
public class KillCourse extends Model {
/**
* 秒杀状态 0:待发布 1:已发布 2:秒杀结束
*/
public static final int PUBLISH_BEFORE = 0;
public static final int PUBLISH_ING = 1;
public static final int PUBLISH_OVER = 2;
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 课程名字
*/
@TableField("course_name")
private String courseName;
/**
* 对应的课程ID
*/
@TableField("course_id")
private Long courseId;
@TableField("kill_price")
private BigDecimal killPrice;
/**
* 秒杀库存
*/
@TableField("kill_count")
private Integer killCount;
/**
* 每个人可以秒杀的数量,默认1
*/
@TableField("kill_limit")
private Integer killLimit = 1;
/**
* 秒杀课程排序
*/
@TableField("kill_sort")
private Integer killSort;
/**
* 秒杀状态:0待发布,1:已发布,2秒杀结束
*/
@TableField("publish_status")
private Integer publishStatus;
/**
* 课程图片
*/
@TableField("course_pic")
private String coursePic;
/**
* 秒杀开始时间
*/
@TableField("start_time")
private Long startTime;
/**
* 秒杀结束时间
*/
@TableField("end_time")
private Long endTime;
/**
* 创建时间
*/
@TableField("create_time")
private Date createTime = new Date();
/**
* 发布到Redis的时间
*/
@TableField("publish_time")
private Date publishTime;
/**
* 老师,用逗号隔开
*/
@TableField("teacher_names")
private String teacherNames;
/**
* 下线时间
*/
@TableField("offline_time")
private Date offlineTime;
@TableField("activity_id")
private Long activityId;
@TableField("time_str")
private String timeStr;
/**
* 秒杀码(防止脚本秒杀)
*/
@TableField(exist = false)
private String killCode;
@Override
protected Serializable pkVal() {
return this.id;
}
//计算秒杀时间差
public Long getTimeDiffMill(){
long nowTime = System.currentTimeMillis();
//如果是秒杀中
if(isKilling()){
//还有多久结束
return (getEndTime() - nowTime) / 1000;
}else if(getKillStatusName().equals("即将秒杀!!")){
//未开始
return (nowTime - getStartTime()) / 1000;
}else {
//秒杀结束
return 0L;
}
}
//秒杀状态的名字
public String getKillStatusName() {
//待发布
if(this.publishStatus.equals(PUBLISH_BEFORE)){
return "待发布";
}
//已发布
if(this.publishStatus.equals(PUBLISH_ING)){
Long now = System.currentTimeMillis();
if(now.longValue() < this.getStartTime().longValue()){
return "即将秒杀!!";
}
if(now.longValue() > this.getEndTime().longValue()){
return "秒杀结束!!";
}
return "秒杀中";
}
//秒杀结束
if(this.publishStatus.equals(PUBLISH_OVER)){
return "秒杀结束!!";
}
return null;
}
//颜色
public Boolean isKilling(){
//已发布
if(this.publishStatus.equals(PUBLISH_ING)){
Long now = System.currentTimeMillis();
if(now.longValue() >= this.getStartTime().longValue()
&& now.longValue() <= this.getEndTime().longValue()){
//在开始跟结束时间之间,就是秒杀中
return true;
}
return false;
}
return false;
}
}
service
/**
*
* 服务实现类
*
*
* @author lyq-yyds
*/
@Service
@Slf4j
public class KillCourseServiceImpl extends ServiceImpl implements IKillCourseService {
@Autowired
private IKillActivityService iKillActivityService;
@Autowired
private RedisTemplate
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)