简单实现redis秒杀场景案例。
java连接redis参考
set 20221101:iphone:stock 500
代码如下(示例):
package com.student.controller;
import com.student.sys.util.JedisPoolUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* Create by zjg on 2022/10/31
*/
@Controller
@RequestMapping("seckill")
public class IPhoneSeckillController {
private static int count=0;
/**
* 双11秒杀苹果
* @return
*/
@PostMapping("iphone")
@ResponseBody
public Map service(){
//1.获取jedis连接
Jedis jedis = null;
Transaction transaction=null;
try {
jedis= JedisPoolUtils.getResource();
//2.数据准备
String now = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String stockKey=now+":iphone:stock";
String stockSet=now+":iphone:set";
String userID = String.valueOf(new Random().nextInt(1000));
//3.尝试连接redis
if(!("PONG".equals(jedis.ping()))){
return setResponse(1001,"连接redis失败");
}
//4.判断库存
synchronized (this){
System.out.println(++count+":"+Thread.currentThread().getName()+"用户"+userID+"开始秒杀");
String stock = jedis.get(stockKey);
if(stock==null){
return setResponse(1002,"库存不足,请明天再来!");
}
int currStock = Integer.parseInt(stock);
if(currStock<=0){
return setResponse(1002,"库存不足,请明天再来!");
}
//4.1判断用户是否已经存在秒杀成功名单中
boolean exist = jedis.sismember(stockSet, userID);
if(exist){
return setResponse(1003,"您今天已经秒杀成功,请改天再来!");
}
//4.2开启事务
transaction= jedis.multi();
transaction.decr(stockKey);
transaction.sadd(stockSet, userID);
List<Object> exec = transaction.exec();
System.out.println(String.format("用户%s秒杀成功",userID));
System.out.println("当前库存量剩余:"+jedis.get(stockKey));
System.out.println("当前秒杀成功的用户:"+jedis.smembers(stockSet));
System.out.println();
}
}catch (Exception e){
if(transaction!=null){
transaction.discard();
}
e.printStackTrace();
return setResponse(1004,"程序发生未知异常,请稍后重试!");
}finally {
//.关闭jedis连接
jedis.close();
}
return setResponse(1000,"秒杀成功");
}
public Map setResponse(int code,String msg){
Map<String,Object> map=new HashMap<>();
map.put("code",code);
map.put("msg",msg);
return map;
}
}
get 20221101:iphone:stock
smembers 20221101:iphone:set
该案例仅供参考。