Redis从入门到精通-Redis-事物和锁机制-秒杀案例-基本实现

一、需求

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

二、后台逻辑

1、用户id和产品id非空判断

2、连接redis
3、拼接相关key,库存key 秒杀成功用户key

4、获取库存,如果库存为null则秒杀还未开始

5、通过用户key取val 判断用户操作是否重复秒杀

6、判断如果商品,库存数量小于1,秒杀结束

7、都过了上面的判断校验,正常秒杀

8、记录秒杀成功的用户方便第三步的判断

三、代码实现

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;
    }
}

四、测试

1、设置库存

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

2、启动项目测试

点击秒杀

 

 

 

 

得到用户id

点击10次,成功显示秒杀结束

 

 

 

 

posted @ 2022-01-13 22:28  KwFruit  阅读(46)  评论(0编辑  收藏  举报