Init Jedis Pool ALL error : false, Exception:ERR SELECT is not allowed in cluster mode
时间: 2024-04-03 19:36:27 浏览: 167
这个错误是由于你在使用 Redis 集群模式时,使用了 SELECT 命令,而在集群模式下是不支持 SELECT 命令的。集群模式下,你应该使用 cluster slots 命令来获取槽信息,然后再使用相应的命令操作 Redis,例如使用 SET、GET 等命令。如果你仍然需要使用 SELECT 命令,则应该在非集群模式下使用 Redis。
相关问题
优化代码 private void jedisClusterScriptLoad(Jedis jedis, byte[] data) { JedisClusterJedis clusterJedis = (JedisClusterJedis) jedis; Map<String, JedisPool> clusterNodes = clusterJedis.getClusterNodes(); for (Map.Entry<String, JedisPool> entry : clusterNodes.entrySet()) { Jedis slotJedis = entry.getValue().getResource(); scriptShaKey = slotJedis.scriptLoad(data); } }
这段代码中可以进行一些优化:
1. 可以加入空值判断,避免出现空指针异常。
2. 在循环之前可以先判断 scriptShaKey 是否已经有值,如果有值则可以直接跳过循环。
3. 可以考虑使用 Java 8 的 Lambda 表达式来简化代码,如:
```
clusterNodes.forEach((key, value) -> {
Jedis slotJedis = value.getResource();
if (scriptShaKey == null) {
scriptShaKey = slotJedis.scriptLoad(data);
}
});
```
优化代码 优化代码 private void jedisClusterScriptLoad(Jedis jedis, byte[] data) { JedisClusterJedis clusterJedis = (JedisClusterJedis) jedis; Map<String, JedisPool> clusterNodes = clusterJedis.getClusterNodes(); for (Map.Entry<String, JedisPool> entry : clusterNodes.entrySet()) { try (Jedis slotJedis = entry.getValue().getResource()){ scriptShaKey = slotJedis.scriptLoad(data); } } }
这段代码中也可以进行一些优化:
1. 可以加入空值判断,避免出现空指针异常。
2. 对于 Redis 集群中每个节点,都需要执行 scriptLoad() 方法,这可能会导致网络传输和计算资源的浪费。可以考虑使用 Redis 客户端的脚本缓存功能,将脚本缓存在客户端本地,并在需要执行脚本时,只将脚本 SHA1 值传递给 Redis 服务器,以节省网络传输和计算资源。
下面是改进后的代码:
```
private Map<String, String> scriptShaCache = new ConcurrentHashMap<>();
private void jedisClusterScriptLoad(Jedis jedis, byte[] data) {
JedisClusterJedis clusterJedis = (JedisClusterJedis) jedis;
Map<String, JedisPool> clusterNodes = clusterJedis.getClusterNodes();
for (Map.Entry<String, JedisPool> entry : clusterNodes.entrySet()) {
String nodeKey = entry.getKey();
JedisPool jedisPool = entry.getValue();
String scriptSha = scriptShaCache.get(nodeKey);
if (scriptSha == null) {
try (Jedis jedis = jedisPool.getResource()) {
scriptSha = jedis.scriptLoad(data);
scriptShaCache.put(nodeKey, scriptSha);
} catch (Exception e) {
// 处理异常
}
}
}
}
```
这段代码中,使用了一个 ConcurrentHashMap 来缓存脚本 SHA1 值。对于每个 Redis 节点,首先从缓存中获取脚本 SHA1 值,如果缓存中不存在,则从连接池中获取一个连接,调用 scriptLoad() 方法加载脚本,并将脚本 SHA1 值缓存到本地。在使用完毕后,使用 try-with-resources 自动释放资源。同时,也可以加入异常处理代码,以增强代码的健壮性。
阅读全文