深浅模式
秒杀案例
需求
某个产品设置库存时,用户在前端页面点击秒杀按钮,库存数减一。
后台逻辑
- 用户id和产品id非空判断
- 通过连接池得到jedis对象_3、拼接相关key,库存key 秒杀成功用户key
- 获取库存,如果库存为null则秒杀还未开始
- 通过用户key取val 判断用户操作是否重复秒杀
- 判断如果商品,库存数量小于1,秒杀结束
- 都过了上面的判断校验,正常秒杀
- 记录秒杀成功的用户方便第三步的判断
代码实现
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次,成功显示秒杀结束

