关键词:
一、前言
前二章我们讲解的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事务是一个单独的隔离操作:事务中的所有... 查看详情