黑马点评stream消息队列循环报错问题

问题描述:

黑马点评项目中 基于stream消息队列 实现秒杀案例中 会创建一个Stream类型的消息队列,名为stream.orders 并且在项目启动时,开启一个线程任务,尝试获取stream.orders中的消息,完成下单

无论你是跟着视频还是看的讲义  写的代码 都是完全没有问题 ,但是一运行项目,会发现循环报错问题。具体报错信息如下

解决方法:

第一种原因:

  • 可能出现和黑马视频中一样的问题 ---   stream.orders这个消息队列名打错了

第二种原因: 

  • Redis没有预加载    (主要原因)

简单来说就是运行之前没有在Redis中初始化消费者组

两种解决方法

        1. 手动初始化   

           我是将Redis在Linux中运行的 本地同理

在 Linux 环境下操作 Redis

  1. 打开终端,连接到 Redis 并执行命令:
       1.1 连接Redis:
            redis-cli
       1.2创建消费者组:
           XGROUP CREATE stream.orders g1 $

    2. 注意事项
 Stream 是否存在:确保 stream.orders 已经存在,否则创建消费者组会失败。
 如果 Stream 不存在,可以先创建一条消息:
   XADD stream.orders * key value

具体操作如下图

         2. 添加代码 自动初始化

在VoucherOrderServiceImpl 中 重写run()方法里面 添加初始化代码

            // 初始化消费者组
            try {
                // 创建消费者组,如果组已存在则忽略错误
                stringRedisTemplate.opsForStream().createGroup(queueName, "g1");
            } catch (Exception e) {
                log.warn("消费者组 g1 已存在,跳过创建");
            }

 具体添加位置参考下图

 第二个未初始化消费者组也是我遇到的问题,因为这个问题卡了好久

希望这篇文章能节约同样这个问题的学习着的处理时间

第一次发布,如果本文有任何问题或不足之处,欢迎随时指出,我会尽力解答和改进!

### 黑马点评应用中的点赞功能报错及附近店铺功能异常解决方案 #### 点赞功能分析与解决方案 对于黑马点评应用中点赞功能的实现,通常涉及前端用户的交互操作以及后端的数据持久化。当遇到点赞功能报错的情况时,可以从以下几个方面排查并解决问题: - **前后端通信验证**:确保从前端发送至服务器的请求参数正确无误,并且API接口设计合理[^2]。 - **数据库事务一致性**:在处理点赞逻辑时,可能涉及到多个表之间的关联更新(如用户表、商品或评论表)。为了防止部分成功导致的数据不一致问题,在修改数据时应采用事务机制来保证操作要么全部完成,要么都不发生改变。特别是针对并发场景下的乐观锁控制可以有效减少竞争条件带来的影响。 - **Redis缓存同步**:如果应用程序使用了Redis作为缓存层,则需要注意保持内存中存储的信息与实际RDBMS里的一致性。例如,在执行点赞动作之后不仅要刷新本地记录还要及时清除或者更新对应的缓存条目以反映最新的状态变化。 ```python def like_item(item_id, user_id): try: with db.transaction(): item = Item.get(Item.id == item_id) item.likes += 1 item.save() # 更新 Redis 缓存 redis_client.incr(f'item:{item_id}:likes') return {"status": "success"} except Exception as e: logger.error(f"Failed to process like action: {str(e)}") raise ``` #### 附近店铺功能优化建议 关于附近店铺功能出现异常的问题,考虑到该特性依赖地理位置信息检索周边商户列表,因此重点在于提升地理空间索引效率和服务稳定性上: - **利用GeoSearchStore指令增强性能**:相较于普通的`GEOSEARCH`命令而言,`GEOSEARCHSTORE`允许我们将查询得到的结果集直接保存到一个新的键名下供后续快速访问。这有助于降低重复计算成本的同时也便于实施分页展示等功能扩展[^1]。 - **引入合理的过期策略管理热点数据**:为了避免频繁读取相同位置范围内的商家详情造成不必要的负载压力,可以在首次加载完成后将其暂存在分布式缓存系统之中,并设定适当的有效期限以便适时清理陈旧副本。一旦检测到原始资源有所变动则立即触发相应的失效通知流程,促使客户端重新获取最新版本的内容。 ```lua -- Lua 脚本用于安全地执行 Geo 搜索并将结果存储起来 local result_key = KEYS[1] local member = ARGV[1] local longitude = tonumber(ARGV[2]) local latitude = tonumber(ARGV[3]) local status, response = pcall(redis.call, 'GEORADIUS', 'shops', longitude, latitude, '50km', 'WITHCOORD' ) if not status then -- 处理错误情况而不中断整个脚本运行 return cjson.encode({ error = tostring(response) }) end redis.call('DEL', result_key) for _, shop_info in ipairs(response) do table.insert(result_set, shop_info[1]) -- 假设只关心 ID 字段 end return cjson.encode({ shops = result_set, }) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值