`

redis抢购实现关键代码

 
阅读更多


在使用redis的时候如果redisTemplate.execute方法执行多条redis命令,则会出现资源无法释放的问题,如果改成redisTemplate.executePipelined则不会出现;
/**
	 * 更新用户信息并将股票余数减1
	 * 
	 * @param ppkey
	 *          队列key:set+mobile
	 * @param upkey
	 *          股票余数
	 * @param rushuser
	 * @return
	 */
	protected boolean updateUserAndDecrStock(final String ppkey, final String upkey, final RushUser rushuser) {
		boolean flag = false;
		try {
			redisTemplate.executePipelined(new RedisCallback<Boolean>() {
				@Override
				public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
					byte[] upkeyb = redisTemplate.getStringSerializer().serialize(upkey);
					byte[] stockKey = redisTemplate.getStringSerializer().serialize(RedisCounterEnum.STOCK_COUNT.getCounterName());// 股权证编号(抢购成功时记录,从1开始递增)
					byte[] ppkeyb = redisTemplate.getStringSerializer().serialize(ppkey);
					connection.watch(upkeyb, stockKey);
					connection.multi();
					Object counter = redisTemplate.opsForValue().get(upkey);
					Object stockNoObject = redisTemplate.opsForValue().get(RedisCounterEnum.STOCK_COUNT.getCounterName());
					int count = Integer.valueOf(counter == null ? "0" : counter.toString());
					int stock = Integer.valueOf(stockNoObject == null ? "0" : stockNoObject.toString());
					if (count > 0) {
						connection.decr(upkeyb);
						String stockNo = (stock + 1) + "";
						rushuser.setStockno(stockNo);// 设置股权证编号
						String value = ZGUtil.objectToJson(rushuser);
						connection.set(stockKey, redisTemplate.getStringSerializer().serialize(stockNo));
						connection.set(ppkeyb, redisTemplate.getStringSerializer().serialize(value));
					}
					connection.exec();
					return null;
				}
			});
			flag = true;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			flag = false;
		}
		return flag;
	}

分享到:
评论

相关推荐

    基于Java的电影票抢购系统开发代码

    在本项目中,"基于Java的电影票抢购系统开发代码"是一个实现在线电影票预订功能的软件系统,主要利用Java编程语言进行开发。这个系统的设计和实现涉及到多个关键知识点,包括但不限于Java核心技术、Web开发框架、...

    基于redis实现高并发异步秒杀点评项目

    1. **代码实现**:项目代码可能包含与Redis交互的客户端库,如Jedis、Lettuce等,以及业务逻辑处理代码。 2. **测试与优化**:进行压力测试,找出性能瓶颈并进行优化,确保在高并发情况下系统稳定运行。 3. **持续...

    PHP+redis实现的限制抢购防止商品超发功能详解

    在讲解PHP结合Redis实现限制抢购防止商品超发功能之前,我们首先要了解几个关键点。首先,为什么需要这样的功能?其次,Redis作为内存数据库,它的哪些特性可以用来帮助实现这个功能?最后,PHP代码如何与Redis交互...

    基于SSM框架+Redis实现的线上秒杀系统项目源码.zip

    在秒杀系统中,Redis的关键作用是存储抢购商品的信息,减少数据库的访问压力,提高系统响应速度。例如,可以将热门商品的库存量保存在Redis中,通过原子操作更新库存,防止并发问题。 5. **高并发处理**:秒杀场景...

    php结合redis实现高并发下的抢购、秒杀功能的实例

    本文将探讨如何使用PHP与Redis来实现高并发下的抢购和秒杀功能。 首先,我们需要解决的第一个问题是高并发对数据库产生的压力。在传统的做法中,每次用户尝试购买商品时,系统都会直接查询数据库中的库存,这在大量...

    Redis 高并发秒杀商品系统(Spring MVC+bootstrap+redis+mybatis)

    其次,Redis的原子操作(如INCR)可以用来实现抢购的公平性,避免因并发问题导致的库存超卖。此外,Redis还可以用作消息队列,存储成功抢购的请求,然后后台异步处理,避免因数据库事务阻塞而降低系统性能。 ...

    redis 用watch 限制 乐观锁 做秒杀 demo

    这一特性使得`WATCH`成为实现分布式乐观锁的关键工具。 乐观锁是一种假设数据在大多数情况下不会发生冲突的锁机制。在乐观锁中,当读取数据时不会加锁,只有在更新数据时才会检查在此期间是否有其他客户端修改了...

    RabbitMQ实现抢购秒杀服务

    在构建高性能、高并发的在线服务时,抢购秒杀活动常常是考验系统承载能力的...在这个过程中,"seckill-order"可能是一个包含具体实现细节的文件,如订单创建的代码示例或配置文件,用于辅助理解和构建抢购秒杀服务。

    基于SpringBoot+MyBatis+Redis+RabbitMQ 实现的秒杀系统.zip

    在秒杀系统中,Redis起到了关键作用: 1. **库存缓存**:秒杀商品的库存信息被预先加载到Redis中,用户发起请求时直接从内存读取,极大地提高了查询速度。 2. **队列限流**:利用Redis的队列功能,可以对请求进行...

    Redis_Qgms.rar

    Redis_Qgms.zip是一个压缩包,包含了使用Redis缓存技术和.NET开发环境构建的抢购秒杀系统的源代码和相关文档。这个项目展示了如何利用Redis的高效数据存储和处理能力来应对高并发的秒杀场景,同时结合C#编程语言和...

    高并发的抢购功能

    通过上述讨论,我们可以看到,在设计和实现高并发场景下的抢购功能时,合理利用Redis、InnoDB等技术,并结合适当的代码优化措施,能够有效地解决库存超卖等问题,同时也能极大地提高系统的稳定性和可靠性。...

    基于SpringBoot+MyBatis+Redis的秒杀系统.zip

    2. **限流策略**:可以使用Redis的 incr 命令实现基于令牌桶或漏桶算法的流量控制,防止请求洪峰导致系统崩溃。 3. **异步处理**:对于秒杀成功后的订单处理,可以使用Redis发布订阅模型,将订单信息放入消息队列,...

    alibabacloud-redis-training-demo

    2021阿里云开发者社区演示资料课程介绍演示资料,代码,视频走进Redis Redis的整体架构,主要数据结构,以及支撑其高性能,高可扩展的关键技术机制。暂无Redis开发实操之春运迁移民页面Redis启动到连接,使用Redis ...

    商品秒杀系统(限时抢购系统),包含商城展示与后台管理,主要技术有:springboot、redis、zookeepe.zip

    《商品秒杀系统:基于SpringBoot、Redis与Zookeeper实现》 在当今电子商务领域,商品秒杀系统(限时抢购系统)已经成为吸引用户流量、提升销售额的重要手段。本系统涵盖了前端商城展示和后台管理功能,核心是利用...

    基于 SpringBoot+Mybatis+Redis+RabbitMQ 秒杀系统 .zip

    此外,Redis 还可以用来实现分布式锁,避免同一商品被多个用户同时抢购。 **RabbitMQ** RabbitMQ 是一个开源的消息代理和队列服务器,遵循 AMQP(Advanced Message Queuing Protocol)协议。在秒杀系统中,RabbitMQ...

    redis分布式锁

    ##### 2.3 Redis实现分布式锁的关键命令 Redis提供了几个核心命令来支持分布式锁的实现: - **SETNX**:Set if Not eXists。用于尝试设置键值对,如果键已存在,则不设置任何内容并返回`0`;如果键不存在,则设置...

    秒杀代码实现.zip

    在这个“秒杀代码实现.zip”压缩包中,我们将会探讨如何使用Spring Boot框架结合Redis缓存来构建一个高效的秒杀系统,以解决商品超卖和用户重复购买的问题。 首先,我们要理解秒杀系统的关键挑战。一方面,由于瞬间...

    秒杀系统设计的所有代码

    以下是关于秒杀系统设计的关键知识点和代码实现概述: 1. **分布式锁**:秒杀活动中,同一商品不能被多个用户同时抢购。因此,需要使用分布式锁来确保并发控制,例如Redis的SetNX命令或Zookeeper的临时节点。 2. *...

Global site tag (gtag.js) - Google Analytics