网络购物秒杀出现超卖现象,是在哪方面没有控制好

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;
	

以上是关于网络购物秒杀出现超卖现象,是在哪方面没有控制好的主要内容,如果未能解决你的问题,请参考以下文章

秒杀扣除库存方案

Java解决高并发秒杀

如何解决秒杀的性能问题和超卖的讨论

求教各位网络高手,思科交换机出现故障,可能是哪方面的原因?

《JAVA——帮你解决高并发秒杀》

Redis高并发场景下秒杀超卖解决