Redis实现乐观锁+分布式事务
项目做了负载后出现的问题优化
原始代码:
问题做了负载后,不同的服务持有不同的lockNumQueue,并发量高的时候出现多个线程抢同一个号源,生成大量的失败订单。
优化后的代码:
通过spring data redis操作redis,将源代码中的lockNumQueue 放入redis,对列表的主键加锁,并对连接标记事务。事务提交后list不为空则成功,否则失败。
注意:连接使用完成后,调用RedisConnectionUtils.unbindConnection(redisTemplate.getConnectionFactory());释放连接,不释放连接可能过段时间会报错。
复现方式:使用线程池访问方法,如果访问的次数达到redis的最大连接数就会出现异常,JedisException: Could notget a resource from the pool