网络购物秒杀出现超卖现象,是在哪方面没有控制好
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络购物秒杀出现超卖现象,是在哪方面没有控制好相关的知识,希望对你有一定的参考价值。
参考技术A 可能是网络问题哦java 用redis如何处理电商平台,秒杀抢购超卖
这是在一个方法调用下面代码的部分
if (!this.checkSoldCountByRedisDate(key, limitCount, buyCount, endDate)) // 标注10:
throw new ServiceException("您购买的商品【" + commodityTitle + "】,数量已达到活动限购量");
2、下面是判断超卖的方法
/** 根据缓存数据查询是否卖超 */
//标注:1;synchronized
private synchronized boolean checkSoldCountByRedisDate(String key, int limitCount, int buyCount, Date endDate)
boolean flag = false;
if (redisUtil.exists(key)) //标注:2;redisUtil.exists(key)
Integer soldCount = (int) redisUtil.get(key);//标注:3;redisUtil.get(key)
Integer totalSoldCount = soldCount + buyCount;
if (limitCount > (totalSoldCount))
flag = false;//标注:4;flag = false
else
if (redisUtil.tryLock(key, 80)) //标注:5;rdisUtil.tryLock(key, 80)
redisUtil.remove(key);// 解锁 //标注:6;redisUtil.remove(key)
redisUtil.set(key, totalSoldCount);//标注:7;redisUtil.set(key, totalSoldCount)
flag = true;
else
throw new ServiceException("活动太火爆啦,请稍后重试");
else
//标注:8;redisUtil.set(key, new String("buyCount"), DateUtil.diffDateTime(endDate, new Date()))
redisUtil.set(key, new String("buyCount"), DateUtil.diffDateTime(endDate, new Date()));
flag = false;
return flag;
3、上面提到的redisUtil类中的方法,其中redisTemplate为org.springframework.data.redis.core.RedisTemplate;这个不了解的可以去网上找下,spring-data-redis.jar的相关文档,贴出来redisUtil用到的相关方法:
/**
* 判断缓存中是否有对应的value
*
* @param key
* @return
*/
public boolean exists(final String key)
return redisTemplate.hasKey(key);
/**
* 将键值对设定一个指定的时间timeout.
*
* @param key
* @param timeout
* 键值对缓存的时间,单位是毫秒
* @return 设置成功返回true,否则返回false
*/
public boolean tryLock(String key, long timeout)
boolean isSuccess = redisTemplate.opsForValue().setIfAbsent(key, "");
if (isSuccess) //标注:9;redisTemplate.expire
redisTemplate.expire(key, timeout, TimeUnit.MILLISECONDS);
return isSuccess;
/**
* 读取缓存
*
* @param key
* @return
*/
public Object get(final String key)
Object result = null;
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
result = operations.get(key);
return result;
/**
* 删除对应的value
*
* @param key
*/
public void remove(final String key)
if (exists(key))
redisTemplate.delete(key);
/**
* 写入缓存
*
* @param key
* @param value
* @return
*/
public boolean set(final String key, Object value)
return set(key, value, null);
/**
*
* @Title: set
* @Description: 写入缓存带有效期
* @param key
* @param value
* @param expireTime
* @return boolean 返回类型
* @throws
*/
public boolean set(final String key, Object value, Long expireTime)
boolean result = false;
try
ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
operations.set(key, value);
if (expireTime != null)
redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
result = true;
catch (Exception e)
e.printStackTrace();
return result;
以上是关于网络购物秒杀出现超卖现象,是在哪方面没有控制好的主要内容,如果未能解决你的问题,请参考以下文章