解决:NOGROUP No such key ‘stream.orders’ or consumer group ‘g1’ in XREADGROUP with GROUP option

在做黑马点评项目的时候
基于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

解决:NOGROUP No such key ‘stream.orders’ or consumer group ‘g1’ in XREADGROUP with GROUP option_第1张图片

这是RESP中的数据结构
解决:NOGROUP No such key ‘stream.orders’ or consumer group ‘g1’ in XREADGROUP with GROUP option_第2张图片
重新启动项目,不报错,且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);
        }
    }

你可能感兴趣的:(java,redis,开发语言)