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

本文介绍了一个关于基于Stream实现异步秒杀项目的常见启动错误及其解决方案。通过创建名为stream.orders的Stream类型消息队列,成功解决了启动时的NOGROUPNosuchkey错误,并附带了测试并发秒杀功能的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

image-20221129145250289

这是RESP中的数据结构
image-20221204141221572
重新启动项目,不报错,且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);
        }
    }
<think>好的,我现在遇到了一个问题,当使用su命令切换用户时,系统提示警告:“cannot change directory to /nonexistent: No such file or directory”。我需要解决这个问题。首先,我应该理解这个警告的原因。 根据经验,当切换用户时,系统会尝试进入该用户的主目录。如果该用户的主目录不存在,比如设置为/nonexistent,就会出现这个警告。这可能是因为用户的主目录被错误配置或者被删除。例如,引用[1]中提到的问题也是由于路径不存在导致的,这里的情况类似。 接下来,我需要验证用户的主目录设置。可以使用命令`grep nobody /etc/passwd`查看用户的主目录路径。如果显示为/nonexistent,这就是问题所在。解决方法应该是创建该目录或者修改用户的主目录到一个存在的路径。 如果需要保留原配置,可以手动创建目录并设置权限:`sudo mkdir /nonexistent`和`sudo chown nobody:nogroup /nonexistent`。这样切换用户时就不会报错了。或者,使用`usermod`命令修改用户的主目录,例如`sudo usermod -d /home/nobody nobody`,但需确保目标目录存在。 另外,引用[3]中提到Python不允许引用不存在的索引,这和系统找不到目录的逻辑类似,都是对不存在的资源进行操作导致的错误。因此,确保目录存在是关键。 总结步骤:检查用户配置,确认主目录是否存在;若不存在则创建或修改配置。这样应该能解决问题。</think>要解决使用`su`命令时出现的警告`cannot change directory to /nonexistent: No such file or directory`,请按以下步骤操作: --- ### **步骤1:理解警告原因** 该警告表示目标用户的主目录(在`/etc/passwd`中定义)不存在。例如,用户`nobody`的主目录可能被设置为`/nonexistent`,但该目录未被实际创建[^1]。 --- ### **步骤2:验证用户主目录配置** 通过以下命令检查用户的主目录设置: ```bash grep nobody /etc/passwd ``` 输出示例: `nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin` 此处`/nonexistent`即为用户的主目录路径。 --- ### **步骤3:解决方案** #### **方法1:创建缺失的目录** 1. 创建目录并设置权限: ```bash sudo mkdir /nonexistent sudo chown nobody:nogroup /nonexistent ``` 2. 再次尝试切换用户: ```bash su nobody ``` #### **方法2:修改用户的主目录** 1. 将用户主目录改为现有路径(如`/tmp`): ```bash sudo usermod -d /tmp nobody ``` 2. 验证修改是否生效: ```bash grep nobody /etc/passwd ``` --- ### **附加说明** - 如果用户不需要登录(如服务账户),主目录缺失不会影响功能,但警告仍会存在。 - 类似问题可参考文件路径配置错误的通用排查方法。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值