springboot项目。tomcat的连接池最大线程数目设置为10。用Jeter做测试,一轮并发100个请求。springboot里面的Controller会请求一个service的方法,该service中有一个打印输出。同时该service上进行了
ehcache缓存注解。那么请问service中的打印输出会打印几次?这几次打印时间节点有什么特征?
pom.xml的maven引入:
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.6</version>
</dependency>
这是ehcache.xml配置文件。贴在classpath目录
<?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" dynamicConfig="false"> <diskStore path="java.io.tmpdir"/> <cache name="users" timeToLiveSeconds="300" maxBytesLocalHeap="50M"/> </ehcache>
application.properties配置文件部分信息,引入ehcache.xml文件。同时配置tomcat的线程池最大线程数为10。
server.tomcat.threads.max=10
spring.cache.ehcache.config=classpath:ehcache.xml
Controller代码如下:
//Contoller代码:
@RestController
@Slf4j
public class QuickStartController {
@Autowired
IStudentService studentService;
@RequestMapping("/jsontest")
@ResponseBody
public String jsontest() {
long startTime=System.currentTimeMillis();
String name=studentService.getStudentName(1L);
log.info("jsontest cost time"+(System.currentTimeMillis()-startTime));
return name;
}
}
Service代码。IStudentService自己加一下。
@Service
@Slf4j
public class StudentServiceImpl implements IStudentService {
@Override
@Cacheable(cacheNames = "users",key = "#studentId")
public String getStudentName(long studentId) {
log.info("请求命中数据库了");
//本来做了一个数据库查询,我这里先注释掉。 studentDao.queryById(studentId);
return "name";
}
}
Jmeter测试请求http://127.0.0.1:8080/jsontest
设置并发一次,一次100个线程。请求Controller中的/jsontest方法。
Idea控制台打印如下:大家主要看打印结果和时间。
2021-05-13 09:28:56.224 INFO 6088 --- [http-nio-8080-exec-9] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.224 INFO 6088 --- [http-nio-8080-exec-8] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.225 INFO 6088 --- [http-nio-8080-exec-3] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.225 INFO 6088 --- [http-nio-8080-exec-7] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.225 INFO 6088 --- [http-nio-8080-exec-1] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.225 INFO 6088 --- [http-nio-8080-exec-10] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.225 INFO 6088 --- [http-nio-8080-exec-4] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.225 INFO 6088 --- [http-nio-8080-exec-6] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.226 INFO 6088 --- [http-nio-8080-exec-5] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.226 INFO 6088 --- [http-nio-8080-exec-2] com.service.StudentServiceImpl : 请求命中数据库了
2021-05-13 09:28:56.248 INFO 6088 --- [http-nio-8080-exec-3] com.QuickStartController : jsontest cost time55
2021-05-13 09:28:56.248 INFO 6088 --- [http-nio-8080-exec-2] com.QuickStartController : jsontest cost time55
2021-05-13 09:28:56.248 INFO 6088 --- [http-nio-8080-exec-6] com.QuickStartController : jsontest cost time55
2021-05-13 09:28:56.248 INFO 6088 --- [http-nio-8080-exec-1] com.QuickStartController : jsontest cost time55
2021-05-13 09:28:56.249 INFO 6088 --- [http-nio-8080-exec-5] com.QuickStartController : jsontest cost time56
2021-05-13 09:28:56.248 INFO 6088 --- [http-nio-8080-exec-10] com.QuickStartController : jsontest cost time50
2021-05-13 09:28:56.248 INFO 6088 --- [http-nio-8080-exec-4] com.QuickStartController : jsontest cost time55
2021-05-13 09:28:56.249 INFO 6088 --- [http-nio-8080-exec-7] com.QuickStartController : jsontest cost time56
2021-05-13 09:28:56.249 INFO 6088 --- [http-nio-8080-exec-8] com.QuickStartController : jsontest cost time56
2021-05-13 09:28:56.248 INFO 6088 --- [http-nio-8080-exec-9] com.QuickStartController : jsontest cost time55
2021-05-13 09:28:56.285 INFO 6088 --- [http-nio-8080-exec-10] com.QuickStartController : jsontest cost time1
2021-05-13 09:28:56.285 INFO 6088 --- [http-nio-8080-exec-4] com.QuickStartController : jsontest cost time0
2021-05-13 09:28:56.285 INFO 6088 --- [http-nio-8080-exec-9] com.QuickStartController : jsontest cost time0
2021-05-13 09:28:56.284 INFO 6088 --- [http-nio-8080-exec-1] com.QuickStartController : jsontest cost time0
2021-05-13 09:28:56.288 INFO 6088 --- [http-nio-8080-exec-6] com.QuickStartController : jsontest cost time1
2021-05-13 09:28:56.292 INFO 6088 --- [http-nio-8080-exec-2] com.QuickStartController : jsontest cost time3
2021-05-13 09:28:56.293 INFO 6088 --- [http-nio-8080-exec-8] com.QuickStartController : jsontest cost time2
2021-05-13 09:28:56.295 INFO 6088 --- [http-nio-8080-exec-3] com.QuickStartController : jsontest cost time1
2021-05-13 09:28:56.297 INFO 6088 --- [http-nio-8080-exec-7] com.QuickStartController : jsontest cost time0
2021-05-13 09:28:56.298 INFO 6088 --- [http-nio-8080-exec-1] com.QuickStartController : jsontest cost time0
2021-05-13 09:28:56.306 INFO 6088 --- [http-nio-8080-exec-9] com.QuickStartController : jsontest cost time0
。。。后续不贴了
解释如下:
tomcat的请求处理,线程池。本质就是一个线程池。server.tomcat.threads.max=10决定了该tomcat的线程池最多只能开10个线程处理请求。
http-nio-8080-exec-1到http-nio-8080-exec-10为线程组中的线程号。很清晰。
一次请求最多处理数为10,Jmeter测试工具的并发让最开始的10个请求都没有命中缓存,同时查库,这里查库代码我省略了。后续90个请求再次进来,大家可以看到service直接查询缓存返回了。并没有跑业务逻辑。
如果10个并发进来,只允许一个请求走业务,其余9个请求等待缓存写入后,再查缓存,怎么弄?走google的guava缓存机制。
电商抢茅台设计。给你一台PC机。用springboot或者ssm框架开发,用 jmeter模拟每秒1000请求,茅台只有100件库存。这里面还要用到流控。
缓存分级,本地缓存可以用ehcache或者guava包下缓存,上层可以用redis或者其他缓存,最后再访问DB,目前来看也是比较经典流行的策略了。