在做黑马点评项目的时候
基于Stream的消息队列实现异步秒杀
启动项目一直报错:NOGROUP No such key ‘stream.orders’ or consumer group ‘g1’ in XREADGROUP with GROUP option
原因:redis中没有stream.orders键
解决方法:创建一个Stream类型的消息队列,名为stream.orders
命令:
XGROUP CREATE stream.orders g1 0 MKSTREAM
# XGROUP CREATE 队列名称 组名称 起始id MKSTREAM不存在则自动创建
# XGROUP 支持创建和销毁组,也支持管理consumer
# XGROUP CREATE key groupname id|$ [MKSTREAM] [ENTRIESREAD entries_read]
# MKSTREAM 可选选项,默认不加的话,如果指定的 stream 不存在会返回错误,加上之后不存在则会自动创建 stream
这是RESP中的数据结构
重新启动项目,不报错,且JMeter并发测试异步秒杀结果正确。
附上保存1000个用户信息并将其token写入文件中的代码
/**
* 在Redis中保存1000个用户信息并将其token写入文件中,方便测试多人秒杀业务
*/
@Test
void testMultiLogin() throws IOException {
List<User> userList = userService.lambdaQuery().last("limit 1000").list();
for (User user : userList) {
String token = UUID.randomUUID().toString(true);
UserDTO userDTO = BeanUtil.copyProperties(user, UserDTO.class);
Map<String, Object> userMap = BeanUtil.beanToMap(userDTO, new HashMap<>(),
CopyOptions.create().ignoreNullValue()
.setFieldValueEditor((fieldName, fieldValue) -> fieldValue.toString()));
String tokenKey = LOGIN_USER_KEY + token;
stringRedisTemplate.opsForHash().putAll(tokenKey, userMap);
stringRedisTemplate.expire(tokenKey, 30, TimeUnit.MINUTES);
}
Set<String> keys = stringRedisTemplate.keys(LOGIN_USER_KEY + "*");
@Cleanup FileWriter fileWriter = new FileWriter(System.getProperty("user.dir") + "\\tokens.txt");
@Cleanup BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
assert keys != null;
for (String key : keys) {
String token = key.substring(LOGIN_USER_KEY.length());
String text = token + "\n";
bufferedWriter.write(text);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75568.html