当前位置: 首页 > news >正文

连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案

1. 问题背景

调整redis的配置后,启动程序时, 会报如下错误:

[redis://172.16.0.8@xxx]: ERR This instance has cluster support disabledSuppressed: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster support disabledat io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)at io.lettuce.core.internal.Exceptions.bubble(Exceptions.java:72)at io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh.getException(DefaultClusterTopologyRefresh.java:402)at io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh.tryFail(DefaultClusterTopologyRefresh.java:173)at io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh.lambda$null$9(DefaultClusterTopologyRefresh.java:150)at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150)at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)at io.lettuce.core.RedisChannelHandler.lambda$closeAsync$0(RedisChannelHandler.java:189)at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)at io.lettuce.core.internal.Futures.lambda$adapt$1(Futures.java:120)at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)at io.netty.channel.AbstractChannel$AbstractUnsafe.doClose0(AbstractChannel.java:756)at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:731)at io.netty.channel.AbstractChannel$AbstractUnsafe.close(AbstractChannel.java:620)at io.netty.channel.DefaultChannelPipeline$HeadContext.close(DefaultChannelPipeline.java:1352)at io.netty.channel.AbstractChannelHandlerContext.invokeClose(AbstractChannelHandlerContext.java:749)at io.netty.channel.AbstractChannelHandlerContext.access$1200(AbstractChannelHandlerContext.java:61)at io.netty.channel.AbstractChannelHandlerContext$11.run(AbstractChannelHandlerContext.java:732)at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)at java.base/java.lang.Thread.run(Thread.java:833)Caused by: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster support disabledat io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:147)at io.lettuce.core.internal.ExceptionFactory.createExecutionException(ExceptionFactory.java:116)at io.lettuce.core.protocol.AsyncCommand.completeResult(AsyncCommand.java:120)at io.lettuce.core.protocol.AsyncCommand.complete(AsyncCommand.java:111)at io.lettuce.core.cluster.topology.TimedAsyncCommand.complete(TimedAsyncCommand.java:52)at io.lettuce.core.protocol.CommandHandler.complete(CommandHandler.java:747)at io.lettuce.core.protocol.CommandHandler.decode(CommandHandler.java:682)at io.lettuce.core.protocol.CommandHandler.channelRead(CommandHandler.java:599)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)

3. 问题原因

这是由于redis的实例不支持集群模式,但是在redisson的配置文件里,使用的是集群模式的方法。因此会产生如下报错。
那么redis的具体有几种模式呢,主要有4种,这个需要根据项目的实际情况进行配置。

4. redis的四种模式

redis的模式主要有4种,分别是单机模式、主从模式、哨兵模式、集群模式。

3.1 单机模式

单机模式就是在一台服务器上安装redis,然后启动,所有业务都调用这一台redis服务器。
优点:部署简单,只需要在一台服务器上安装并启动redis就行。
成本低,没有备用节点,不需要其他的开支。
高性能,单机不需要同步数据,数据天然一致性。
缺点:可靠性较弱,一旦服务器宕机,所有业务都无法使用redis服务。单机模式redis性能受限于CPU的处理能力。
在这里插入图片描述

3.2 主从模式

主从模式是指有多台redis服务器,其中一台专门用来负责写入客户端请求数据,称为主节点(master),
其他服务专门负责处理客户端的读取数据的请求不负责写入数据,称为从节点。
主节点写入的数据会复制的各个从节点上,并且数据复制的方向是单向的,只能从主节点复制到从节点。
优点

  1. 读写分离:master写,slave读,同时可以根据访问需求⼤⼩来添加slave节点数量。
  2. 负载均衡:通过读写分离的⽅式来分但服务器负载,主节点负责写⼊数据,多个从节点负责读取数据,缓解单个服务器访问的压⼒,提⾼读的吞吐量。
  3. 数据冗余:主从复制实现了数据的热备份,是持久化之外的⼀种数据冗余⽅式。
  4. ⾼可⽤性:提⾼了服务的可⽤性,多个节点同时提供服务,当前其中⼀台节点宕机后,其他节点仍然可以提供服务。
  5. 故障恢复:master宕机后,快速升级slave为master。
    缺点
  6. master宕机后,slave节点升级成新的master节点后,需要⼿动切换主机,同时会有部分数据不能及时同步从服务器,造成数据不⼀致。
  7. slave宕机后,多个slave恢复后,⼤量的SYNC同步会造成master IO压⼒倍增。
  8. 主从模式只要⼀个maste节点,所以master节点的写数据的能⼒会受到单机的限制。
    在这里插入图片描述

3.3 哨兵模式

哨兵模式主要是在主从复制模式基础上,增加了⾃动化的故障恢复功能。
因为主从复制模式下,当master节点宕机后,虽然slave节点会升级成新的master节点,但是升级后的slave节点的ip顺其⾃然的就称为了新的master节点ip,原先其他的slave节点配置的master节点的ip也是需要变更的,在主从复制模式下,这种变更是需要⼈⼯⼿动去修改配置⽂件的。⽽哨兵模式则完美的解决了这⼀缺陷,实现了快速的⾃动恢复,不再需要⼈⼯修改。
主要功能

  1. 集群监控:负责监控 master 和 slave 进程是否正常⼯作。
  2. 消息通知:如果某个 Redis 实例宕机,那么哨兵负责向(哨兵间,客户端)发送消息。
  3. ⾃动故障转移:当master宕机后,由哨兵负责重新在slave节点中选举出新的master节点,并将其他slave连接到新的master,以及告知客户端新的服务器地址。更好的为客户端提供⾼可⽤服务。
    缺点
    哨兵的部署会占⽤额外的服务器资源,且不提供数据的读取服务。哨兵模式除了解决了主从模式⼿动切换主从节点的问题外,其他主从模式存在的问题,哨兵模式基本也都存在。

在这里插入图片描述

3.4 集群模式

主从模式实现了数据的热备份,哨兵模式实现了redis的⾼可⽤。但是这两种模式存在两个问题:
(1)写并发:这两种都只能有⼀个master节点负责写操作,在⾼并发的写操作场景,master节点就会成为性能瓶颈。⽽redis集群则可以实现多个节点同时提供写操作,redis集群模式采⽤⽆中⼼结构,每个节点都可以看做是⼀个主从模式,节点之间互相连接从⽽知道整个集群状态。
(2)海量数据的存储压⼒:⽆论是哨兵模式还是主从模式,每台机器上存储的数据都是⼀样的,都是从主节点上复制过去的,本质上只有⼀台Master作为存储。所以⽆论增加多少slave节点都⽆法解决单台机器存储的上限问题。但是集群模式就解决了这以问题,因为Redis Cluster是⼀种服务器 Sharding 技术,采⽤数据分⽚的⽅式,将不同的数据存储在不同的master节点上⾯,因为我们可以通过不断的增加集群中的节点,从⽽达到存储海量数据。

redis集群的实现原理
Redis集群采⽤去中⼼化的思想,没有中⼼节点的说法,对于客户端来说,整个集群可以看成⼀个整体,可以连接任意⼀个节点进⾏操作,就像操作单⼀Redis实例⼀样,不需要任何代理中间件,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node。Redis也内置了⾼可⽤机制,⽀持N个master节点,每个master节点都可以挂载多个slave节点,当master节点挂掉时,集群会提升它的某个slave节点作为新的master节点。Redis集群可以看成多个主从架构组合起来的,每⼀个主从架构可以看成⼀个节点(其中,只有master节点具有处理请求的能⼒,slave节点主要是⽤于节点的⾼可⽤)。

集群的扩容与收缩
集群主要是采⽤hash slot 算法进⾏寻址的,由于集群hash槽的数⽬是固定的,所以随着集群中节点数⽬的增减,每个节点所负责的hash槽的数⽬也会随之发⽣变化,因此对应槽和数据都会在节点之间移动。
1.扩容步骤:
(1)启动新节点;
(2)刚启动的新节点是没有和其他节点进⾏通讯的,因此需要在集群中任意节点执⾏ clustermeet 命令让新节点加⼊到集群中;
(3)新的节点加⼊到集群后,迁移槽和数据,将⼀些槽和数据从旧节点迁移到新节点;
(4)槽和数据迁移到新加⼊的节点后,新的节点会向集群中的各个主节点⼴播通知迁移过来的槽,并更新⾃身的槽节点对应表。
2. 收缩步骤:
(1)迁移槽,⾸先判断要下线的节点是否有负责的槽,如果有,则先将该节点下的槽全部迁移到其他节点,否则直接删除该节点。
(2)通知集群的各个节点忘记⾃⼰。
在这里插入图片描述

5 修改RedisServer配置解决

提示语ERR This instance has cluster support disabled说明RedisServer不支持集群。
修改配置文件redis.conf中的cluster-enabled参数的值为yes并把参数前#去除,重启Redis服务器。
注意:不能通过命令config set cluster-enable yes来解决,因为config命令里面没有cluster-enable配置项。

6 修改RedisClient配置解决

如果无法修改RedisServer权限,并且RedisServer不是集群部署,而是单机模式,那就只能从代码配置上修改一下了,Configuration从Cluster变成Standalone即可。以下代码兼容不同配置的redis集群:

@Configuration
public class RedisConfiguration{//加载配置@AutowiredRedisProperty redisProperty@Bean("myRedisConfig")public Config myRedisConfig(){Conifg config = new Config();if("single".equalsIgnoreCase(RedisProperty.getRedisMode)){// 单机模式conifg.userSingleServer().........}else if("cluster".equalsIgnoreCase(RedisProperty.getRedisMode)){// 集群模式conifg.userClusterServer().........}return config;}
}@Configuration
@ConfigurationProperties(prefix="my.redis")
public class RedisProperty{...redisMode="";...
}//配置.property文件
# 单机模式,可以根据实际情况进行配置
# my.redis.single
# 集群模式
my.redis.cluster

参考:
https://www.cnblogs.com/laityguanguan/p/17473862.html

相关文章:

连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案

1. 问题背景 调整redis的配置后,启动程序时, 会报如下错误: [redis://172.16.0.8xxx]: ERR This instance has cluster support disabledSuppressed: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster supp…...

什么是json?json可以存放哪几种数据类型

JSON指的是JavaScript对象表示法(avaScript Object Notation),是轻量级的文本数据交换格式,独立于语言: JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解析器和JSON库支持许多不同的编程语言&#xff…...

网络编程套接字应用分享【Linux C/C++ 】【UDP应用 | TCP应用 | TCP线程池小项目】

目录 前提知识 1. 理解源ip,目的ip和Macip 2. 端口号 3. 初识TCP,UDP协议 4. 网络字节序 5. socket 编程 sockaddr类型 一,基于udp协议编程 1. socket——创建套接字 2. bind——将套接字强绑定 3. recvfrom——接受数据 4. s…...

有关数据开发项目中使用HIVE由于无法update和delete的场景下,如何解决数据增量的思路

解决数据增量问题的思路在Hive中 在数据开发项目中,使用Hive进行数据处理时,由于Hive不支持update和delete语句,处理数据增量可能会变得有些棘手。然而,有几种策略和技术可以帮助我们解决这个问题,并确保数据增量的高…...

两数之和-考察哈希表的运用

题目 给定一个整数数组 n u m s nums nums和一个整数目标值 t a r g e t target target,请你在该数组中找出和为目标值 t a r g e t target target的那 两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同…...

视觉检测系统,外观细节无可挑剔

在传统行业中,利用人工检测来检测产品外观缺陷依然是主流,但由于竞争的加剧,对企业生产效率的要求也越来越高。传统的检测产品外观缺陷问题的方法就是透过人工目检,或者工人采用游标卡尺等工具检测,此种方式检测速度慢…...

C++中string容器的字符串操作

目录 1.c_str() 返回C常量字符串 2.date() 返回C常量字符串 3.substr() 构造子串 4.find() 正向查找(查找失败返回npos) 5.rfind() 逆向查找(查找失败返回npos) 6.find_first_of() 正向查找匹配的字符 7.find_last_of() 逆向…...

Java编程使用CGLIB动态代理介绍与实战演示

文章目录 前言技术积累核心概念主要功能适用场景与JDK动态代理的对比 实战演示定义待代理的目标类实现MethodInterceptor接口使用代理对象 测试结果写在最后 前言 在Java编程中,CGLIB (Code Generation Library) 是一个强大的高性能代码生成库,它通过生…...

vue3 渲染一个后端返回的图片字段渲染、table表格内放置图片

一、后端直接返回图片url 当图片字段接口直接返回的是图片url&#xff0c;可以直接放到img标签上 <img v-if"thumbLoader" class"r-image-loader-thumb" :src"resUrl" /> 二、当图片字段接口直接返回的是图片Id 那么就需要去拼一下图片…...

iOS开发进阶(十三):脚手架创建iOS项目

文章目录 一、前言二、xcode-select 命令三、拓展阅读 一、前言 项目初期&#xff0c;需要搭建项目基本框架&#xff0c;为此离不开辅助工具&#xff0c;即脚手架。当然&#xff0c;IDE也可以实现新建空白项目&#xff0c;但是其新建后的项目结构可能不符合预期设计&#xff0…...

手机无线投屏到windows11电脑

1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息...

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…...

Git常用语句

设置用户名 git config --global user.name "用户名" git config --global user.email "邮箱"查看git用户信息 cat ~/.gitconfig初始化本地库 git initclone指定分支的代码 git clone -b my_branch gitgitlabxxxxxxxxxxxxxxxxxxxxxx.gitpush三件套 gi…...

坦克大战_java源码_swing界面_带毕业论文

一. 演示视频 坦克大战_java源码_swing界面_带毕业论文 二. 实现步骤 完整项目获取 https://githubs.xyz/y22.html 部分截图 启动类是 TankClinet.java&#xff0c;内置碰撞检测算法&#xff0c;线程&#xff0c;安全集合&#xff0c;一切皆对象思想等&#xff0c;是java进阶…...

JVM 记录

记录 工具 https://gceasy.io 资料 尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟机&#xff09; https://www.bilibili.com/video/BV1PJ411n7xZ?p361 全套课程分为《内存与垃圾回收篇》《字节码与类的加载篇》《性能监控与调优篇》三个篇章。 上篇《内存与垃圾回收篇…...

Linux学习笔记————C 语言版 LED 灯实验

这里写目录标题 一、实验程序编写二、 汇编部分实验程序编写三、C 语言部分实验程序编写四、编译下载验证 汇编 LED 灯实验中&#xff0c;我们讲解了如何使用汇编来编写 LED 灯驱动&#xff0c;实际工作中是很少用到汇编去写嵌入式驱动的&#xff0c;毕竟汇编太难&#xff0c;而…...

Spring Boot 配置文件

1. 配置文件的作用 配置文件主要是为了解决硬件编码带来的问题&#xff0c;把可能会发生改变的信息&#xff0c;放在一个集中的地方&#xff0c;当我们启动某个程序时&#xff0c;程序从配置文件中读取一些数据&#xff0c;并加载运行。 硬编码是将数据直接放在源代码中&…...

IPKISS ------ 查看器件默认端口名称

IPKISS ------ 查看器件默认端口名称 正文正文 我们这里以 Grating Coupler 举例。 import si_fab.all as pdk import ipkiss3.all as i3class MyGratingCoupler(i3.circuit):gc = i3.childcellProperty(<...

uni-app踩坑记录

uni-app踩坑记录 Failed to load local image resource xxx the server responded with a status of 500 (HTTP/1.1 500 Internal Server Error) Failed to load local image resource xxx the server responded with a status of 500 (HTTP/1.1 500 Internal Server Error) 文…...

【嵌入式硬件】光耦

1.光耦作用 光耦一般用于信号的隔离。当两个电路的电源参考点不相关时,使用光耦可以保证在两边不共地的情况下,完成信号的传输。 2.光耦原理 光耦的原理图如下所示,其内部可以看做一个特殊的“三极管”; 一般的三极管是通过基极B和发射极E间的电流,去控制集电极C和发射极…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...