放到前面
(影响因素太多,可能有MySQL缓存什么的,不一定准)
参数: 1000个用户同时访问。
优化之前:
平均响应时间100ms,吞吐量是295/sec
使用lua脚本+Stream改造之后,
平均响应时间5ms,吞吐量311/sec。
可以看到平均响应时间有明显的提高。
redis版本问题
服务器内存不够,我直接用的windows版本。
stream只有在5.0之后才能用,这里贴上5.0版本。
测试过程
构建1000个用户放到Redis和token.txt
@Test
public void login1000() {
// 从数据库tb_user表中查询出前1000条id phone 通过id升序排列的前1000条数据
List<User> users = userService.list(new QueryWrapper<User>().orderByAsc("id").last("LIMIT 1000"));
// 逐个生成token,插入到redis中 string token =UUID.randomUUID().tostring(true);
String directoryPath = System.getProperty("user.dir") + "/output"; // 项目根目录下的output文件夹
String fullPath = directoryPath + "/tokens.txt";
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fullPath))) {
// 遍历每一个用户
for (User user : users) {
// 为每个用户生成token
String token = UUID.randomUUID().toString();
String tokenKey = RedisConstants.LOGIN_USER_KEY + token;
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
Map<String, Object> userMap = BeanUtil.beanToMap(userDTO);
//初始化一个新的HashMap来存放字符串类型的数据
Map<String, String> stringuserMap = new HashMap<>();
// 遍历原来的userMap,将每个值转换为字符串,只有这样stringRedisTemplate才可以存储
for (Map.Entry<String, Object> entry : userMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue() == null ? null : entry.getValue().toString();
stringuserMap.put(key, value);
}
stringRedisTemplate.opsForHash().putAll(tokenKey, stringuserMap);
stringRedisTemplate.expire(tokenKey, 100L, TimeUnit.HOURS);
// 将token写入到本地文件中
writer.write(token + "\n");
}
} catch (
IOException e) {
e.printStackTrace();
}
}
打开redis
Jemter设置变量
测试完成检查Redis和MySQL库存和订单表