redis事务系列之三redis乐观锁实现秒杀(代码片段)

程序编织梦想 程序编织梦想     2022-12-11     180

关键词:

一、前言

前二章我们讲解的redis事务和redis乐观锁,您可以点击下面文章查看。

Redis事务系列之一Redis事务详解

Redis事务系列之二Redis实现乐观锁

本章我们继续在上面的基础上用乐观锁实现秒杀。

二、秒杀的实现

我们先来设置一个场景,假设有50个商品,1000个人抢购。那么最终会有50个人买到商品。

在实现上我们配合着线程池来实现。具体代码如下:

public class Main 

	public static void main(String[] args) 
		RedisConnect.redisConn();

		String redisKey = "second";
		ExecutorService executorService = Executors.newFixedThreadPool(20);
		try 
			Jedis jedis = new Jedis("127.0.0.1");
			// 初始值
			jedis.set(redisKey, "0");
			jedis.close();
		 catch (Exception e) 
			e.printStackTrace();
		
		for (int i = 0; i < 1000; i++) 
			executorService.execute(() -> 
				Jedis jedis1 = new Jedis("127.0.0.1");
				try 
					jedis1.watch(redisKey);
					String redisValue = jedis1.get(redisKey);
					int valInteger = Integer.valueOf(redisValue);
					String userInfo = UUID.randomUUID().toString();
					// 没有秒完
					if (valInteger < 20) 
						Transaction tx = jedis1.multi();
						tx.incr(redisKey);
						List list = tx.exec();
						// 秒成功  失败返回空list而不是空
						if (list != null && list.size() > 0) 
							System.out.println("用户:" + userInfo + ",秒杀成功! 当前成功人数:" + (valInteger + 1));
						
						// 版本变化,被别人抢了。
						else 
							System.out.println("用户:" + userInfo + ",秒杀失败");
						
					
					// 秒完了
					else 
						System.out.println("已经有20人秒杀成功,秒杀结束");
					
				 catch (Exception e) 
					e.printStackTrace();
				 finally 
					jedis1.close();
				
			);
		
		executorService.shutdown();
	


执行结果如下:

代码中用线程池能防止内存资源瞬间爆棚。这块代码也好理解,这里我就不过多介绍了。

三、结尾

好了,本节就讲到这里,希望对大家有所帮助。
另外大家帮忙关注一下我的微信公众号,关注后有大量课程想赠。

redis事务系列之二redis实现乐观锁(代码片段)

一、前言上一章我们讲解了Redis事务系列之一Redis事务详解,你可以点击连接查看,这一章我们在Redis事务的基础上实现乐观锁。注意,本章知识以上一章知识为基础,如果redis事务不了解,请看完Redis事务再来... 查看详情

redis事务系列之二redis实现乐观锁(代码片段)

一、前言上一章我们讲解了Redis事务系列之一Redis事务详解,你可以点击连接查看,这一章我们在Redis事务的基础上实现乐观锁。注意,本章知识以上一章知识为基础,如果redis事务不了解,请看完Redis事务再来... 查看详情

redis事务系列之一redis事务详解(代码片段)

一、前言本章是redis事务系列知识第一章,redis事务系列主要讲解以下内容:redis事务redis乐观锁讲解redis乐观锁实现秒杀我们一步一步来,本章主要讲解事务。二、事务2.1事务阐述讲redis事务之前,我们先来看看事... 查看详情

利用乐观锁及redis解决电商秒杀高并发基本逻辑

...化redis$redis=newRedis();//设置键值,起到监视作用 执行事务之前,判断被修改,回滚$redis->watch(‘sales‘);//获取销量$sales=$redis->get(‘sales‘);//如果销量存在,先删除, 查看详情

redis中的乐观锁和悲观锁

...只是对key上锁,只要key不变就代表不会出问题。redis中的事务multi默认使用乐观锁,这将会导致一个问题:在秒杀这种高并发环境下,容易造成超卖问题。如,在一件商品只剩一件时,这时A用户开启事务只准备抢购,而就在A完成... 查看详情

redis事务系列之一redis事务详解(代码片段)

一、前言本章是redis事务系列知识第一章,redis事务系列主要讲解以下内容:redis事务redis乐观锁讲解redis乐观锁实现秒杀我们一步一步来,本章主要讲解事务。二、事务2.1事务阐述讲redis事务之前,我们先来看看事... 查看详情

redis学习redis事务秒杀案例(代码片段)

...本在Redis中的优势3.LUA脚本实现一、前期准备为了模拟Redis事务中的并发操作,需要安装工具CentOS6默认安装CentOS7需要手动安装本机是CentOS7所以手动安装联网情况下:联网:yuminstallhttp 查看详情

redis学习redis事务秒杀案例(代码片段)

...本在Redis中的优势3.LUA脚本实现一、前期准备为了模拟Redis事务中的并发操作,需要安装工具CentOS6默认安装CentOS7需要手动安装本机是CentOS7所以手动安装联网情况下:联网:yuminstallhttp 查看详情

redis08_redis的事务multi(声明一个事务)exec(执行一个事务)redis里面为什么要有事务悲观锁和乐观锁(可以并发提高吞吐量)

redis的事务系列文章目录文章目录redis的事务系列文章目录前言第一种情况:组队成功exec第二种情况:组队不成功,队伍解散第三种情况:编译时不报错就执行,与MySQL不同,不回滚redis里面为什么要有事务... 查看详情

学习笔记——redis事务乐观锁悲观锁

2023-01-29一、redis事务与乐观锁相关命令1、redis事务(1)redis事务的含义redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序执行。事务在执行过程中,不会被其他客户端送来的命令请求所打断。(2)redis事务... 查看详情

redis实现秒杀(代码片段)

...:4unw1、秒杀逻辑秒杀:解决计数器和人员记录的事务 查看详情

redis学习redis分布式锁实现秒杀业务(乐观锁悲观锁)(代码片段)

####1、业务场景所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源,这里的资源在大部分秒杀场景里是商品;将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀ÿ... 查看详情

redis乐观锁和悲观锁在springboot的使用(代码片段)

...过这个数据获取version更新时候比较version使用监听操作和事务操作实现乐观锁测试多线程修改值,使用watch可以当作redis的乐观锁操作在事务执行之前先watchkey,当事务前后key改变了事务失败,那就先取消监视,再... 查看详情

redis乐观锁和悲观锁在springboot的使用(代码片段)

...过这个数据获取version更新时候比较version使用监听操作和事务操作实现乐观锁测试多线程修改值,使用watch可以当作redis的乐观锁操作在事务执行之前先watchkey,当事务前后key改变了事务失败,那就先取消监视,再... 查看详情

redis6事务和锁机制(代码片段)

目录事务基本操作错误机制悲观锁乐观锁Redis事务三特性秒杀案例超卖问题连接超时问题库存遗留问题事务        Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中ÿ... 查看详情

redis6事务和锁机制(代码片段)

目录事务基本操作错误机制悲观锁乐观锁Redis事务三特性秒杀案例超卖问题连接超时问题库存遗留问题事务        Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中ÿ... 查看详情

redis:多线程修改同一个key使用watch+事务(mutil)实现乐观锁(代码片段)

本篇文章是通过watch(监控)+mutil(事务)实现应用于在分布式高并发处理等相关场景。下边先通过redis-cli.exe来测试多个线程修改时,遇到问题及解决问题。高并发下修改同一个key遇到的问题:1)定义一个hash类型的key,key为:l... 查看详情

reids学习redis中的事务学习

文章目录一、Redis的事务定义二、multi、exec、discard三、事务的错误处理四、事务冲突的问题1.悲观锁2.乐观锁3.watchkey实现乐观锁4.unwatch五、Redis事务三大特性一、Redis的事务定义Redis事务是一个单独的隔离操作:事务中的所有... 查看详情