redis 集群连接成功执行命令 MOVED XXXX 192.168.50.177:8003 问题解决
D:\haojingkeji\flask-vue-crud\redisclear>python redisclear.py redis连接成功 Redis<ConnectionPool<Connection<host=192.168.50.162,port=8003,db=0>>> MOVED 15160 192.168.50.177:8003
问题原因:
Redis集群的问题:我需要从新设置redis集群某个键的值,没有机器的登录权限,然后用python写了一个脚本处理,报这个错。
节点会对命令请求进行分析和key的slot计算,并且会查找这个命令所要处理的键所在的槽。如果要查找的哈希槽正好就由接收到命令的节点负责处理, 那么节点就直接执行这个命令。
如果所查找的槽不是由该节点处理的话, 节点将查看自身内部所保存的哈希槽到节点 ID 的映射记录, 并向客户端回复一个 MOVED 错误。上面的错误信息包含键 x 所属的哈希槽15495, 以及负责处理这个槽的节点的 IP 和端口号 192.168.50.177:8003
解决办法:
直接用返回的MOVED 错误里的IP和端口连接就可以了,当然也可以捕获异常的方式处理。
#!/usr/bin/env python # -*- encoding: utf-8 -*- # pip install redis # Python 3.9.0 ''' @File : redisclear.py @Time : 2021/12/1 10:32:56 @Author : Li Ruilong @Version : 1.0 @Contact : 1224965096@qq.com @Desc : redis 集群指定键值clear ''' # here put the import lib import redis ip = '192.168.50.177' password = '*********' port = 8003 conn=redis.Redis(host=ip,password=password,port=port,decode_responses=True) print("redis连接成功",conn,"\n") def ex(conn): print("当前的redis值为:",conn.get('GROUP_CIRCUIT-3'),"\n") conn.set('GROUP_CIRCUIT-3',600) print("修改后redis值为:",conn.get('GROUP_CIRCUIT-3'),"\n") if __name__ == '__main__': try: rs = conn.get('GROUP_CIRCUIT-3') except Exception as e: print(e) c= str(e).split() print("集群节点问题,从新连接到输出节点操作","\n") ip = str(c[2]).split(':')[0] port = str(c[2]).split(':')[1] print(ip,port,"\n") conn=redis.Redis(host=ip,password=password,port=int(port),decode_responses=True) rs = conn.get('GROUP_CIRCUIT-3') ex(conn) else: ex(conn)
虽然我们用Node ID来标识集群中的节点, 但是为了让客户端的转向操作尽可能地简单, 节点在 MOVED 错误中直接返回目标节点的 IP 和端口号, 而不是目标节点的 ID 。客户端应该记录槽15495由节点 192.168.50.177:8003负责处理“这一信息, 这样当再次有命令需要对槽15495执行时, 客户端就可以加快寻找正确节点的速度。这样,当集群处于稳定状态时,所有客户端最终都会保存有一个哈希槽至节点的映射记录,使得集群非常高效: 客户端可以直接向正确的节点发送命令请求, 无须转向、代理或者其他任何可能发生单点故障(single point failure)的实体(entiy)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构