Redis有序集合和定时任务解决订单15分钟关闭

直接上代码

   下单减去库存

    public String updatePersonStock(PageData pd) throws Exception {
Map resmap = new HashMap<>();
int result = dao.updateReturnInt("PersonstockMapper.updatePersonStock", pd);
if (result == 1) {
// 返回下单成功
logger.info("抢购成功" + pd);
resmap.put("code", "10000");
resmap.put("message", "抢购成功");
zset = redisTemplate.opsForZSet();
long orderId = Long.valueOf(String.valueOf(pd.get("orderId")));
long time = System.currentTimeMillis()+900000;
zset.add(Const.KEY, orderId, time);
return FastJsonUtils.toJSONString(resmap);
} else {
dao.updateReturnInt("PersonstockMapper.updateAddStock", pd);
logger.info("购买数量大于商品限制购买数量" + pd);
// 返回下单失败
resmap.put("code", "10613");
resmap.put("message", "购买数量大于商品限制购买数量");
return FastJsonUtils.toJSONString(resmap);
}

}

 

//下面是定时任务 处理订单超时

       public final static String KEY = "csh_timeoutpromotionorderset";   

         /**

* 随机生成 雪花算法
*/
public final static long ORDERID = 25312144988416020l;
/**
* 设置一个 比较大的值
*/

public final static long SCORE = 9999999999999L;

//处理订单超时 15分钟调用一次

public void dealPromotionOrderTimeout() throws Exception {
zset = redisTemplate.opsForZSet();
Double result = zset.score(Const.KEY, Const.ORDERID);
//result为空 表示key未创建 或key值 丢失过  修改1: 不确定该方法是否成功 redis集群 不怕丢数据可忽略
if (result == null) {
// 先取消,调用方法全表扫描
orderService.dealPromotionOrderTimeout();
// 再添加
zset.add(Const.KEY, Const.ORDERID, Const.SCORE);
cancelPromotionOrder(Const.KEY);
}else{
cancelPromotionOrder(Const.KEY);
}

}

 

public void cancelPromotionOrder(String key) throws InterruptedException  {
ZSetOperations zset = redisTemplate.opsForZSet();
long time = System.currentTimeMillis()+900000;
while (System.currentTimeMillis() Set> itemSet = zset.rangeWithScores(key, 0, 0);
if (itemSet == null || itemSet.isEmpty()) {
Thread.sleep(1000);
continue;
}else{
double score = ((TypedTuple) itemSet.toArray()[0]).getScore();
if(score == Const.SCORE){
Thread.sleep(1000);
continue;
}
}
double score = ((TypedTuple) itemSet.toArray()[0]).getScore(); // 超时时间搓
double currentTime = System.currentTimeMillis();
if (currentTime >= score) {
long element = ((TypedTuple) itemSet.toArray()[0]).getValue(); // orderID
PageData pd = new PageData();
pd.put("ordesstatus", "X");
pd.put("ordersid", element);
pd.put("key", key);
pd.put("element", element);
/**
* 1 是订单已经取消失败DuplicateKeyException
* 0 是取消成功
* 2 是订单已经取消
*/
int result = orderService.buttonCancalOrderRedis(pd);
if(result == 0){
logger.info( " redis 处理了一个订单取消任务 score:" + score + ", member:" + element);
zset.remove(key, element);
}else if(result == 1){
zset.remove(key, element);
}else if(result == 2){
zset.remove(key, element);
}else{
logger.error( "服务器异常");
}

}
}
}
 

 

 

你可能感兴趣的:(项目方案)