Redis实现商品秒杀功能

第一种

固定名字入redis数据库,一个一个入库
在这里插入图片描述
商品名字IponeX
商品库存:20件
在这里插入图片描述
Java代码:

@Log("秒杀商品")
	@AuthIgnore
	@PostMapping("getGoods")
	public String getGoods(String successId) {	//抢购成功用户的id
		TbSchool tbSchool=new TbSchool();
		tbSchool=tbSchoolService.selectById(191);	//商品的id
		String goodsName=tbSchool.getName();		//商品名字
		Integer goodsNum=tbSchool.getType();		//商品库存
		//System.out.println("商品名字:"+goodsName+" 商品库存"+goodsNum+"件");
		String data="";
		//System.out.println(redisTemplate.opsForValue().increment("iponeX", 1));
		//increment 会首先检查是否有缓存,如果没有则置0并加1,如果有缓存则累加1
		Long num=redisTemplate.opsForValue().increment(goodsName, 1);
		//System.out.println(num);
		if (num<=goodsNum) {	//如果抢购的次数小于等于库存,抢购成功
			//抢购成功用户的id会存到Redis数据库中的list类型中
			redisTemplate.opsForList().leftPush("success", successId);	
			data="秒杀成功!还剩"+(goodsNum-num)+"件!";
		}else {
			data="商品没有货了,请到下一个活动时间再来";
		}
		return data;
	}

在这里插入图片描述
在这里插入图片描述

第二种

Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java

这种发放需要导入一个jar包

下载地址>>//static.runoob.com/download/jedis-2.9.0.jar
在这里插入图片描述
随机生成随机数(相当于用户的唯一信息)入redis数据库

商品名字IponeX
商品库存:40000件
在这里插入图片描述

@AuthIgnore
	@PostMapping("Jedis")
	public R Jedis() {
		//连接本地的 Redis 服务
	    Jedis jedis = new Jedis("localhost");
	    System.out.println("连接成功");
	    //查看服务是否运行
	    System.out.println("服务正在运行: "+jedis.ping());
	    //模拟100人请求秒杀(高压力)
	    TbSchool tbSchool=new TbSchool();
		tbSchool=tbSchoolService.selectById(191);		
		Integer goodsNums=tbSchool.getType();		//商品数量
	    Random random=new Random();
	    long startTime=System.currentTimeMillis();	//开始时间
	    for (int i = 0; i <goodsNums+1; i++) {
			int rand=random.nextInt(10000000);
			String a=Integer.toString(rand);
			if (jedis.llen("success")<goodsNums) {
				jedis.rpush("success", a);
				System.out.println(a+"用户>>>秒杀成功,还剩"+(goodsNums-jedis.llen("success"))+"件");
			}else {
				System.out.println("商品没有了,秒杀结束");
			}
		}
	    long endTime=System.currentTimeMillis();
	    System.out.println("活动开始到结束"+(endTime-startTime)+"毫秒");
	    jedis.close();
	    System.out.println("已关闭redis");
	    return R.ok().put("msg","活动结束!!共耗时"+(endTime-startTime)+"毫秒");
	}

在这里插入图片描述

第三种

左进右出
在这里插入图片描述
商品名字IponeX
商品库存:40000件
在这里插入图片描述
左进代码:

@Log("左进redis数据库")
	@AuthIgnore
	@PostMapping("leftIn")
	public R leftin() {
		Random random=new Random();	//实例化随机类
		TbSchool tbSchool=new TbSchool();
		tbSchool=tbSchoolService.selectById(191);		
		Integer goodsNums=tbSchool.getType();		//商品数量
		long startTime=System.currentTimeMillis();	//开始时间
		for (int i = 0; i < goodsNums+1; i++) {		//最后一次秒杀结束效果
			int rand=random.nextInt(10000000);
			//redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
			
			String a=Integer.toString(rand);
			long len=redisTemplate.opsForList().size("success");//长度
			if(len<goodsNums) {
				redisTemplate.opsForList().leftPush("success", a);	
				System.out.println(a+"用户>>>秒杀成功,还剩"+(goodsNums-(len+1))+"件");
			}else {
				System.out.println("商品没有了,秒杀结束");
			}
		}
		long endTime=System.currentTimeMillis();	//结束时间
		return R.ok().put("msg","活动结束!!共耗时"+(endTime-startTime)+"毫秒");
	}

在这里插入图片描述
右出代码:

@Log("右进redis数据库")
	@AuthIgnore
	@PostMapping("rightGo")
	public R rightGo(){
		//redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer())
		String start="";
		long b=redisTemplate.opsForList().size("success");
		System.out.println(b);
		if(b==0) {
			start="数据库没有数据了";
		}else {
			long startTime=System.currentTimeMillis();	//开始时间
			for (int i = 0; i < b; i++) {
				String a=(String)redisTemplate.opsForList().rightPop("success");
				SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.sss");
				System.out.println(a+">>>用户出库时间"+simpleDateFormat.format(new Date()));
			}	
			long endTime=System.currentTimeMillis();	//结束时间
			start="出库成功,共耗时"+(endTime-startTime)+"毫秒";
		}
		return R.ok().put("msg",start);
	}

出库数据库已经没有了
在这里插入图片描述

发布了35 篇原创文章 · 获赞 50 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_45736927/article/details/104845046