Skip to content

秒杀案例

需求

某个产品设置库存时,用户在前端页面点击秒杀按钮,库存数减一。

后台逻辑

  1. 用户id和产品id非空判断
  2. 通过连接池得到jedis对象_3、拼接相关key,库存key 秒杀成功用户key
  3. 获取库存,如果库存为null则秒杀还未开始
  4. 通过用户key取val 判断用户操作是否重复秒杀
  5. 判断如果商品,库存数量小于1,秒杀结束
  6. 都过了上面的判断校验,正常秒杀
  7. 记录秒杀成功的用户方便第三步的判断

代码实现

java
package com.atguigu;

import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.slf4j.LoggerFactory;

import ch.qos.logback.core.rolling.helper.IntegerTokenConverter;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.Transaction;

public class SecKill_redis {

	public static void main(String[] args) {
		Jedis jedis =new Jedis("192.168.117.134",6379);
		System.out.println(jedis.ping());
		jedis.close();
	}

	//秒杀过程
	public static boolean doSecKill(String uid,String prodid) throws IOException {
		//1 uid和prodid非空判断
		if(uid == null && prodid == null){
               return false;
		}

		//2 连接redis
		//通过连接池得到jedis对象
		Jedis jedis =new Jedis("192.168.117.134",6379);

		//3 拼接key
		// 3.1 库存key
		String kcKey="sk:"+prodid+":qt";

		// 3.2 秒杀成功用户key
		String userKey="sk:"+prodid+":user";

		//监视库存
		String kcVal = jedis.get(kcKey);


		//4 获取库存,如果库存null,秒杀还没有开始
		if(kcVal == null){
			System.out.println("秒杀还没有开始,请等待。");
			jedis.close();
			return false;
		}


		// 5 判断用户是否重复秒杀操作
		Boolean sismember = jedis.sismember(userKey, uid);
		if(sismember){
			System.out.println("已经秒杀过了,不能重复秒杀");
			jedis.close();
			return false;
		}
		//6 判断如果商品数量,库存数量小于1,秒杀结束
		int intKcVal = Integer.parseInt(kcVal);
		if(intKcVal<=0){
			System.out.println("秒杀结束");
			jedis.close();
			return false;
		}


		//7.1 库存-1
		jedis.decr(kcKey);
		//7.2 把秒杀成功用户添加清单里面
		jedis.sadd(userKey,uid);
		System.out.println("秒杀成功");
		return true;
	}
}

测试

设置库存

shell
flushdb #清库
set sk:0101:qt 10        #设置库存 10个

启动项目测试

点击秒杀 得到用户id点击10次,成功显示秒杀结束