1.Redis服务器 can not get resource from pool.
1000个线程并发还能跑,5000个线程的时候出现这种问题,彩38源码搭建QQ:2152876294 网址diguaym.com后台debug日志,发现redis 线程池不够。刚开始设置的是:
redis 配置文件
#redis
redis.host=127.0.0.1
redis.port=6379
redis.timeout=300 等待时间 10s改为300s
redis.password=123456
redis.poolMaxTotal=1000 连接数,刚开始最大连接数 设置为100.
redis.poolMaxIdle=500 最大空闲连接数 100改成500
redis.poolMaxWait=300
顺便也改了一下jdbc 的连接池参数,最大空闲和最大连接数都改成1000.在测一下。可以
spring.datasource.filters=stat
spring.datasource.maxActive=1000
spring.datasource.initialSize=100
spring.datasource.maxWait=60000
spring.datasource.minIdle=500
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=select ‘x‘
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxOpenPreparedStatements=20
2.5000并发下的问题,20个商品,库存减到-4980。
后来看代码发现,判断库存用的是if(stock==0 ) 抛出异常。应该用stock<0,因为 若此时同时2个线程进来,就永远小于0,后面的业务逻辑都可以执行。
3.然后就是超卖的问题
第一次压力测试的时候,5000个线程,分别取不同的token(sessionId),同时访问 秒杀这个接口,商品个数只放了20个。结果出现最后商品数量变负的问题。
4.编码的问题
接口限流防刷的时候,通过计数器限流,如果超过某个阈值,向前端返回一个codeMsg对象用于显示的时候,显示的是String是乱码的问题,之前由于一直返回都是json 格式,都是封装好在data里。
这次返回是直接通过输出流直接写到response直接返回字节数组的,而不是spring controller 返回数据(springboot 默认utf-8),出现乱码问题,用utf-8编码,解决。
原文地址:http://blog.51cto.com/13907497/2154154