在使用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基于redis实现分布式锁代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
使用命令介绍: SETNX SETNX key val 当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。 expire expire key timeout 为key设置一个超时时间,单位为second,超过这个时间...
redis实现登录退出代码(包括工具类)
redis代码分析。 适合想要深入了解redis的开发者。了解了实现中的优缺点,才能更好的使用redis。
使用redis缓存的代码示例,框架使用的springboot,有兴趣的可以参考
个人测试redis cluster spring整合代码 的demo
java使用DelayQueue延迟队列和Redis缓存实现订单自动取消功能
2. 代码实现 关于Redis集群配置代码此处不贴,直接贴配置监听类代码! redis.host1: 10.113.56.68 redis.port1: 7030 redis.host2: 10.113.56.68 redis.port2: 7031 redis.host3: 10.113.56.6
springboot整合redis.算是比较全面的一种整合方式了. springboot整合redis.算是比较全面的一种整合方式了.
redis 写的操作性能测试代码
redis实现简单排行榜,和消息处理。
修改的redis代码,进行了部分的多核优化,在特定情况下会有一些性能提升!
redis学习资料
redis操作源代码以及查看redis的情况的辅助代码以及redis安装包
redis分布式锁,包含单服务器上锁解锁情况,和分布式上锁解锁情况,全部封装在类里,有需要可以下载,希望可以帮助到你。
Redis中使用Java代码的方式实现发布订阅流程-发布者示例代码.zip
.NET MVC Redis 实现简单的抢购队列,RPush LPop 实现高并发抢购队列
基于mq和redis实现的秒杀系统基于mq和redis实现的秒杀系统
基于Redis方式实现分布式锁
此工程是将redis和spring的整合作为一个公共的工程,只需在你的maven工程的pom文件中引入该工程即可使用,并将该工程的类添加到你的spring扫描的base-package中即可