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次,成功显示秒杀结束