在使用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核心技术、Web开发框架、...
1. **代码实现**:项目代码可能包含与Redis交互的客户端库,如Jedis、Lettuce等,以及业务逻辑处理代码。 2. **测试与优化**:进行压力测试,找出性能瓶颈并进行优化,确保在高并发情况下系统稳定运行。 3. **持续...
在讲解PHP结合Redis实现限制抢购防止商品超发功能之前,我们首先要了解几个关键点。首先,为什么需要这样的功能?其次,Redis作为内存数据库,它的哪些特性可以用来帮助实现这个功能?最后,PHP代码如何与Redis交互...
在秒杀系统中,Redis的关键作用是存储抢购商品的信息,减少数据库的访问压力,提高系统响应速度。例如,可以将热门商品的库存量保存在Redis中,通过原子操作更新库存,防止并发问题。 5. **高并发处理**:秒杀场景...
本文将探讨如何使用PHP与Redis来实现高并发下的抢购和秒杀功能。 首先,我们需要解决的第一个问题是高并发对数据库产生的压力。在传统的做法中,每次用户尝试购买商品时,系统都会直接查询数据库中的库存,这在大量...
其次,Redis的原子操作(如INCR)可以用来实现抢购的公平性,避免因并发问题导致的库存超卖。此外,Redis还可以用作消息队列,存储成功抢购的请求,然后后台异步处理,避免因数据库事务阻塞而降低系统性能。 ...
这一特性使得`WATCH`成为实现分布式乐观锁的关键工具。 乐观锁是一种假设数据在大多数情况下不会发生冲突的锁机制。在乐观锁中,当读取数据时不会加锁,只有在更新数据时才会检查在此期间是否有其他客户端修改了...
在构建高性能、高并发的在线服务时,抢购秒杀活动常常是考验系统承载能力的...在这个过程中,"seckill-order"可能是一个包含具体实现细节的文件,如订单创建的代码示例或配置文件,用于辅助理解和构建抢购秒杀服务。
在秒杀系统中,Redis起到了关键作用: 1. **库存缓存**:秒杀商品的库存信息被预先加载到Redis中,用户发起请求时直接从内存读取,极大地提高了查询速度。 2. **队列限流**:利用Redis的队列功能,可以对请求进行...
Redis_Qgms.zip是一个压缩包,包含了使用Redis缓存技术和.NET开发环境构建的抢购秒杀系统的源代码和相关文档。这个项目展示了如何利用Redis的高效数据存储和处理能力来应对高并发的秒杀场景,同时结合C#编程语言和...
通过上述讨论,我们可以看到,在设计和实现高并发场景下的抢购功能时,合理利用Redis、InnoDB等技术,并结合适当的代码优化措施,能够有效地解决库存超卖等问题,同时也能极大地提高系统的稳定性和可靠性。...
2. **限流策略**:可以使用Redis的 incr 命令实现基于令牌桶或漏桶算法的流量控制,防止请求洪峰导致系统崩溃。 3. **异步处理**:对于秒杀成功后的订单处理,可以使用Redis发布订阅模型,将订单信息放入消息队列,...
2021阿里云开发者社区演示资料课程介绍演示资料,代码,视频走进Redis Redis的整体架构,主要数据结构,以及支撑其高性能,高可扩展的关键技术机制。暂无Redis开发实操之春运迁移民页面Redis启动到连接,使用Redis ...
《商品秒杀系统:基于SpringBoot、Redis与Zookeeper实现》 在当今电子商务领域,商品秒杀系统(限时抢购系统)已经成为吸引用户流量、提升销售额的重要手段。本系统涵盖了前端商城展示和后台管理功能,核心是利用...
此外,Redis 还可以用来实现分布式锁,避免同一商品被多个用户同时抢购。 **RabbitMQ** RabbitMQ 是一个开源的消息代理和队列服务器,遵循 AMQP(Advanced Message Queuing Protocol)协议。在秒杀系统中,RabbitMQ...
##### 2.3 Redis实现分布式锁的关键命令 Redis提供了几个核心命令来支持分布式锁的实现: - **SETNX**:Set if Not eXists。用于尝试设置键值对,如果键已存在,则不设置任何内容并返回`0`;如果键不存在,则设置...
在这个“秒杀代码实现.zip”压缩包中,我们将会探讨如何使用Spring Boot框架结合Redis缓存来构建一个高效的秒杀系统,以解决商品超卖和用户重复购买的问题。 首先,我们要理解秒杀系统的关键挑战。一方面,由于瞬间...
以下是关于秒杀系统设计的关键知识点和代码实现概述: 1. **分布式锁**:秒杀活动中,同一商品不能被多个用户同时抢购。因此,需要使用分布式锁来确保并发控制,例如Redis的SetNX命令或Zookeeper的临时节点。 2. *...