??? redis watch 实现乐观锁秒杀

redis 事务,redis实现秒杀,悲观锁秒杀,乐观锁秒杀 文章目录事务redis乐观锁实现秒杀超卖需求redis悲观锁实现秒杀超卖需求非事务管道 事务 操作 # ex,过期时间(秒) # px,过期时间(毫秒) # nx,如果设置为True,则只有name不存在时,当前set操作才执行 # xx,如果设置为True,则只有name存在时,当前set操作才执行 redis_client.set('name', 'zs', ex=10) 事务... 阅读详情

运行一万笔,抢10笔商品,运行完毕,抢购控制成功,但是运行失败和总次数不够一万,这个问题还在排查,失败的条数每次运行不一致,

参考  https://www.jianshu.com/p/43b786079a1e

@RunWith(SpringRunner.class)  
@SpringBootTest
public class RedisWatchTest {
	private static final Logger logger = LoggerFactory.getLogger(RedisTransactionTest.class);
	
	@Autowired
	RedisUtil redis;
	
	@Autowired
	private RedisTemplate<String, String> redisTemplate;
	
	private String watchKey = "watchKey";
	
	@Test
	public void test() {
		Jedis jedis = new Jedis("127.0.0.1",6379);
		jedis.auth("123456");  //设置密码
		
		redisTemplate.watch(watchKey);
		ExecutorService executor = Executors.newFixedThreadPool(20);
		
		jedis.set(watchKey, "0");  //重置watchkey 为0
		jedis.del("setSucc","setFail"); //清空抢成功的和失败的		
		jedis.close();
		
		for(int i=0;i<10000;i++) {
			executor.execute(new RedisWatchRunner());			
		}
		
		executor.shutdown();
		
		
	}

}

 

public class RedisWatchRunner implements Runnable{
	
	private static final Logger logger = LoggerFactory.getLogger(RedisTransactionTest.class);
	
//	@Autowired
//	RedisUtil redis;
	
	@Autowired
	private RedisTemplate<String, String> redisTemplate;
	
	private String watchKey = "watchKey";

	@Override
	public void run() {
		System.out.println("进入抢购环节");
		// TODO Auto-generated method stub
		try {
			Jedis jedis = new Jedis("127.0.0.1",6379);
			jedis.auth("123456");  //设置密码
			
			jedis.watch(watchKey);
			String val = (String) jedis.get(watchKey);
			System.out.println("当前value:" + val); 
			int valInt = Integer.valueOf(val);
			String userInfo = UUID.randomUUID().toString();
			
			/**
			 * 一万个用户一共抢购10个产品
			 */
			if(valInt < 10) {
				Transaction tx = jedis.multi();  //开启事务
				tx.incr(watchKey);
				List<Object> list = tx.exec();   //提交事务,如果此时 watchKey 值变动,返回null
				if(list != null) {
					System.out.println("用户" + userInfo + "抢购成功,当前抢购成功人数为:" + (valInt + 1));
					/**抢购成功业务逻辑					 */
					jedis.sadd("setSucc", userInfo);
				}else {
					System.out.println("用户进入" + userInfo + "抢购失败");
					jedis.sadd("setFail", userInfo);
				}
				
			}else {
				System.out.println("用户未进入" + userInfo + "抢购失败");
				jedis.sadd("setFail", userInfo);
				return;
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			
		}
		
	}

}

总量改成1千和2千运行的总数是正常的,

 

redis 用watch 限制 乐观锁 做秒杀 demo 不用队列,队列太占用内存,所以用redis 的watch 就是乐观锁的原理,来做的秒杀 抢购 立即下载

相关推荐

【DDSCAT——离散偶极近似仿真程序05】模型设计Matlab代码:多核壳球 、多核壳圆柱

简洁明了,后面及部分给出的都是模型设计的Matlab代码,这些代码都来自于一篇文章:Chin C W S. Localized Surface Plasmon Resonance with the use of Silver and Titanium Oxide Nanostructures[J]. 2011. 一、设计多个核壳球形结构 1)Matlab代码 ...

XD_Yangf的博客 4256

Redis高并发锁(二)乐观锁

Redis高并发锁(二)乐观锁 watch+multi+exec

范大的博客 532

Shopee滑块验证码太刁钻?手把手教你用Python+Playwright绕过弧形验证(附影刀RPA接入代码)

本文详细介绍了如何使用Python和Playwright结合SadCaptcha第三方服务高效破解Shopee平台的弧形滑块验证码,并集成到影刀RPA工作流中。该方案开发周期短、准确率高(>90%),特别适合跨境电商自动化操作,已在实际项目中验证成功。

weixin_29284657的博客 567

基于redis的乐观锁实践

edis真是一个分布式应用场景下的好东西,对于我们的应用设计,功劳大大的! 今天要研究的是基于redis的事务机制以及watch指令(CAS)实现乐观锁的过程。 所谓乐观锁,就是利用版本号比较机制,只是在读数据的时候,将读到的数据的版本号一起读出来,当对数据的操作结束后,准备写数据的时候,再进行一次数据版本号的比较,若版本号没有变化,即认为数据是一致的,没有更改,可以直接写入,若版本号有...

weixin_30767835的博客 407

YOLOv11【第六章:模型压缩与极致优化篇·第15节】YOLOv11 专用剪枝工具库使用指南!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1312

个人顶级AI助手OpenClaw(Clawdbot) - 新手快速入门指南

本文详细介绍了个人顶级AI助手OpenClaw(Clawdbot) 的快速入门指南,包括安装部署和使用配置及注意事项

program哲学 5302

Redis实现乐观锁

本文先讲解了Redis中的事务,然后再结合乐观锁讲解。

m0_50281408的博客 1284

编译zlib库给IOS平台用

在弹出的下面对话框中选择Unix Makefiles ,然后点击(Done)完成。使用 lipo与otool查看库类型为arm64,现在可在ios平台使用该库了。zlib自带CMakeLists.txt 所以用CMake-GUI来生成。修改为与系统当前安装的cmake版本 (如:3.22.1)选择zlib源码目录及输出目录,输入下图的CMAKE参数。点击Configure,在弹出的对话框中选择Yes。cmake --install . 进行安装。cmake --build . 进行编译。

993

redis-乐观锁Watch使用方法

redis-乐观锁Watch使用方法

weixin_54097396的博客 1080

ChatGPT搭配Claude 4写文献综述效果出奇的好!四步法直接写出逻辑清晰、层次分明的文献综述(附复制即用专业提示词)

请梳理【研究领域】中核心理论的发展演进过程,包括每一阶段理论的核心观点、提出背景与推动力,并指出理论演化中的关键节点或范式转变。请根据以下文献摘要内容,帮助我梳理该主题的研究趋势,包括:常见研究视角、研究方法的演变、研究对象的变化方向等。请根据以下研究空白与我已有的研究基础,帮我生成一个清晰的研究定位,包括:研究主题、研究对象、方法路径和理论框架。先要明确这个研究领域中一个主导或热门的理论,比如社会支持理论、认知负荷理论等,强调这个理论内部的不一致性、适用性争议,通过交代这⼀争议的背景,引发读者兴趣。

智能AI让学术科研更容易 568

利用Dify构建文档内容的分析对比

本次主要做了一些workflow和Agent的应用实现,供大家参考。主要目的是为了进行两个内部报告文件的内容对比,特别是报告中的各类审批表、申请表、推荐表和流程对比,本地数据通过知识库方式分别加载到两个知识库中,编制工作流针对同一个问题进行知识库检索,之后将查询结果进行合并,再一起提交给LLM进行对比,最终将对比分析结果以markdown方式返回显示。主要包括如何构建知识库,如何设计workflow、如何将工作流发布为工具、如何设计提示词、如何在agent中引入前面发布的工具,最终通过agent实现与用户交

hhue2007的专栏 2522

Redis使用Watch命令演示乐观锁(含图解)

Redis使用Watch命令演示乐观锁(含图解),个人笔记总结!

calm_programmer的博客 1171

3、利用预训练卷积神经网络进行特征提取

本文介绍了如何使用预训练的卷积神经网络(如VGG16)进行图像特征提取,并将提取的特征存储在HDF5数据集中,以便后续用于机器学习模型的训练。文章详细阐述了特征提取的原理、HDF5数据格式的优势、HDF5DatasetWriter类的实现、特征提取流程的代码实现以及实际应用案例。通过该方法,可以在多种图像数据集上高效构建高精度的分类模型。

z2a3b4c5d的博客 112

Redis100篇 - Redis的事务进阶 Watch命令实现乐观锁

Redis事务进阶:Watch命令实现乐观锁 摘要 本文深入探讨Redis的Watch命令实现乐观锁机制,解决高并发场景下的数据一致性问题。文章首先分析Redis基础事务的局限性,包括不支持回滚和冲突检测,并通过库存超卖案例展示并发问题。然后详细讲解Watch命令的工作原理,采用乐观锁思想在事务执行前监视key变化。最后提供完整的Java+Spring Boot实战代码,演示如何实现带重试机制的库存扣减功能,包括项目配置、RedisTemplate使用和乐观锁实现细节。通过Mermaid流程图和并发对比图,

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Redis分布式锁----乐观锁的实现,以秒杀系统为例

     摘要:本文使用redis来实现乐观锁,并以秒杀系统为实例来讲解整个过程。 本文源码请在这里下载:https://github.com/appleappleapple/DistributeLearning 乐观锁       大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个”version”字...

Evankaka的专栏 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Redis实现秒杀功能

Redis使用watch完成秒杀抢购功能: redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表。它的优点如下: 1.首先选用内存数据库来抢购速度极快。 2. 速度快并发自然没不是问题。 3. 使用悲观锁,会迅速增加系统资源。 4. 比队列强的多,队列会使你的内存数据库资源瞬间爆棚。 5...

ZhangLongYi的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java使用redis事务以及watch实现乐观锁秒杀

import org.springframework.util.CollectionUtils; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class RedisOptimi

晨曦 895

Redis分布式锁实现秒杀业务(乐观锁、悲观锁)

一、业务场景   所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源,这里的资源在大部分秒杀场景里是商品;将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀,就必须控制线程对资源的争抢,既要保证高效并发,也要保证操作的正确。 二、一些可能的实现   刚才提到过,实现秒杀的关键点是控制线程对资源的争抢,根据基本的线程知识,可以不加思索的想到下面的一些方法: 1)、秒杀...

最怕一生碌碌无为,还安慰自己平凡可贵 3万+

Spring Retry 与 Redis WATCH 结合实现高并发环境下的乐观锁

在当今分布式与微服务架构盛行的互联网业务场景下,高并发已成为常态。无论是电商秒杀、抢购活动,还是在线抢票、抽奖服务,都需要在瞬间应对大量的请求,并准确、高效地更新数据状态。这类场景中一个典型的问题便是如何在高并发下对资源(例如库存、配额)进行安全稳定的扣减操作,避免超卖或脏读脏写。为了应对这些挑战,后端架构和应用层通常会引入乐观锁等并发控制机制,以确保数据一致性和操作的原子性。

hello.reader 1538

在Redis中秒杀场景下超时与超卖问题的解决方案

redis高并发场景下秒杀问题的解决方案

h123456789999999的博客 5719

Redis事务和Redis乐观锁详解

1 Redis事务介绍 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis的事务是通过multi、exec、discard和watch这四个命令来完成的。 Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。 Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行。 Redis不支持回滚操作 1.1 命令介绍 multi:用于标记事务块的开始,Redis会将后续

warybee 1721

使用redis来实现 秒杀系统

摘之: http://www.waydos.com/post/optimistic-lock-in-redis/ redis 单进程单线程的模式, 决定了多客户端连接间不会产生竞态, 其所有命令都是原子性的, 用来实现一些队列 锁等服务, 简直再合适不过了. 另有一姊妹篇 : 基于redis的悲观锁实现 说来也很简单, 只是利用了redis 的 watch/unwatch + mulit/exec...

Yan 小铁匠 2597

乐观锁几种实现方式(Mybatis+Redis+Jedis)

上文我们介绍了一下什么是乐观锁和悲观锁以及实现的思路。Mysql乐观锁与悲观锁的区别。本文中,我们简单实现一下乐观锁。 文章目录一、Mybatis实现二、Redis实现 乐观锁介绍:   乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么我们如何实现乐观锁呢,一般来说有以下2种方式: 一、Mybatis实现 1、...

时光、疏离了记忆づ童话的博客 7330

【Redis学习】Redis分布式锁实现秒杀业务(乐观锁、悲观锁)

1、业务场景所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源,这里的资源在大部分秒杀场景里是商品;将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀,就必须控制线程对资源的争抢,既要保证高效并发,也要保证操作的正确。2、一些可能的实现刚才提到过,实现秒杀的关键点是控制线程对资源的争抢,根据基本的线程知识,可以不加思索的想到下面的一些方法: 1)、秒杀在技术层面的抽象应该就

lmb55的专栏 6861
上一篇: linux 下 java 单个class文件执行和多个class文件打包调用,执行
下一篇: ClassNotFoundException: com.lowagie.text.pdf.PdfGState
小瑞
博客等级 码龄19年 240粉丝 274原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值