jedis 4.1.1版本集群模式 keys解决方案

jedis以集群方式连接redis会使用redis.clients.jedis.JedisCluster
集群下直接使用JedisCluster.keys()会报错
Cluster mode only supports KEYS command with pattern containing hash-tag ( curly-brackets enclosed string )
错误解决:
jedis 4.X以前 集群keys的解决方案是遍历

Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();

然后遍历clusterNodes,即可用如下方法获取keys

Jedis j = jedisPool.getResource();
j.keys();

jedis 4.X以后 集群keys的解决方案是遍历

Map<String, ConnectionPool> clusterNodes = jedisCluster.getClusterNodes();

返回的类是ConnectionPool,而不是JedisPool。
ConnectionPool.getResource()返回的是redis.clients.jedis.Connection类,里面没有操作redis的命令。
查看源码Jedis.java

  @Override
  public Set<String> keys(final String pattern) {
    checkIsInMultiOrPipeline();
    return connection.executeCommand(commandObjects.keys(pattern));
  }

我们可以仿此方法写我们自己的keys实现:

	//初始化集群链接
	JedisCluster jedisCluster = getCluster();
	
	private final CommandObjects commandObjects = new CommandObjects();
	
	// 搜索集群内
    private Set<String> clusterKeys(String pattern) {
        Set<String> result = new HashSet<>();
        // 获取Redis集群内所有节点
        Map<String, ConnectionPool> clusterNodes = jedisCluster.getClusterNodes();

        for (Map.Entry<String, ConnectionPool> entry : clusterNodes.entrySet()) {
            Connection resource = entry.getValue().getResource();

            Set<String> res = resource.executeCommand(commandObjects.keys(pattern));
            if (!CollectionUtils.isEmpty(res)) {
                // 合并搜索结果
                result.addAll(res);
            }
            resource.close();
        }
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值