面试题答案
一键面试Python示例
在Python中使用redis - py
库连接Redis集群。
import rediscluster
# 初始化Redis集群连接
startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]
rc = rediscluster.RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
try:
# 执行Redis操作
result = rc.get('key')
except rediscluster.AskError as e:
# 捕获ASK错误
print(f"ASK错误发生在请求: get('key')")
print(f"涉及的错误信息: {str(e)}")
# 从错误信息中提取节点信息(ASK <slot> <ip>:<port> 格式)
parts = str(e).split(' ')
if len(parts) == 3:
slot = parts[1]
node_info = parts[2]
print(f"涉及的槽位: {slot}")
print(f"涉及的节点: {node_info}")
代码解释
- 初始化连接:使用
rediscluster.RedisCluster
初始化与Redis集群的连接,startup_nodes
指定了集群中的一个或多个节点。 - 执行操作:在
try
块中执行Redis操作,这里以获取键'key'
为例。 - 捕获错误:在
except
块中捕获AskError
。当捕获到该错误时,首先打印发生错误的具体请求(这里是get('key')
),然后打印完整的错误信息。 - 提取节点信息:ASK错误信息格式通常为
ASK <slot> <ip>:<port>
,通过对错误信息字符串进行分割,可以提取出涉及的槽位和节点信息并打印出来。
Java示例
使用Jedis库连接Redis集群。
import redis.clients.jedis.*;
import java.util.HashSet;
import java.util.Set;
public class RedisClusterAskErrorExample {
public static void main(String[] args) {
Set<HostAndPort> jedisClusterNodes = new HashSet<>();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes);
try {
String result = jedisCluster.get("key");
} catch (JedisAskDataException e) {
System.out.println("ASK错误发生在请求: get('key')");
System.out.println("涉及的错误信息: " + e.getMessage());
// 从错误信息中提取节点信息(ASK <slot> <ip>:<port> 格式)
String[] parts = e.getMessage().split(" ");
if (parts.length == 3) {
String slot = parts[1];
String nodeInfo = parts[2];
System.out.println("涉及的槽位: " + slot);
System.out.println("涉及的节点: " + nodeInfo);
}
} finally {
jedisCluster.close();
}
}
}
代码解释
- 初始化连接:创建一个
Set<HostAndPort>
,并添加集群中的节点,然后使用JedisCluster
初始化与Redis集群的连接。 - 执行操作:在
try
块中执行Redis操作,这里同样是获取键"key"
。 - 捕获错误:在
catch
块中捕获JedisAskDataException
,打印发生错误的具体请求(get('key')
)和完整的错误信息。 - 提取节点信息:与Python类似,对错误信息字符串进行分割,提取出涉及的槽位和节点信息并打印。
- 关闭连接:在
finally
块中关闭JedisCluster连接,确保资源正确释放。