3
回答
Jedis 的 JedisCluster 不提供 keys 方法

Jedis 的 JedisCluster 模式下没有提供 keys(...) 方法,一般该如何破呢? 为什么会不提供这个方法吗?难道在集群环境下有难度? 

举报
红薯
发帖于8个月前 3回/1K+阅

目前我们是使用spring整合后的,就可以在集群环境使用keys了。

例如:application.properties配置

spring.redis.cluster.nodes=\
  192.168.11.124:7001\
  ,192.168.11.124:7002\
  ,192.168.11.124:7003\
  ,192.168.11.125:7004\
  ,192.168.11.125:7005\
  ,192.168.11.125:7006

然后,就可以这样用

package sunyu.example.bigdata.monitor;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RedisTests {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Test
    public void t1() {
        stringRedisTemplate.keys()
    }

}

 

--- 共有 1 条评论 ---
红薯关键是他底层怎么实现的呢?是 jedis 吗? 8个月前 回复

@红薯

是这样实现的

/*
	 * (non-Javadoc)
	 * @see org.springframework.data.redis.connection.RedisKeyCommands#keys(byte[])
	 */
	@Override
	public Set<byte[]> keys(final byte[] pattern) {

		Assert.notNull(pattern, "Pattern must not be null!");

		Collection<Set<byte[]>> keysPerNode = clusterCommandExecutor
				.executeCommandOnAllNodes(new JedisClusterCommandCallback<Set<byte[]>>() {

					@Override
					public Set<byte[]> doInCluster(Jedis client) {
						return client.keys(pattern);
					}
				}).resultsAsList();

		Set<byte[]> keys = new HashSet<byte[]>();
		for (Set<byte[]> keySet : keysPerNode) {
			keys.addAll(keySet);
		}
		return keys;
	}

看源码来说,是循环了集群中,所有的节点,然后每个节点做keys,最后再加到一块给你返回来了。

顶部