JedisCluster:“扫描密钥”不起作用

我试图扫描JedisCluster中存储的特定密钥。

String product = "MMATest";

String redisServer = "mycachecluster.eaogs8.0001.usw2.cache.amazonaws.com:6379,mycachecluster.eaogs8.0002.usw2.cache.amazonaws.com:6379";

Set<HostAndPort> jedisClusterNode = new HashSet<>();

String[] serversArray = redisServer.split(";");

for (String aServersArray : serversArray) {

jedisClusterNode.add(new HostAndPort(aServersArray.split(":")[0],

Integer.valueOf(aServersArray.split(":")[1])));

}

JedisCluster jedisCluster = new JedisCluster(jedisClusterNode,

buildPoolConfig());

ScanParams params = new ScanParams();

StringJoiner joiner = new StringJoiner("");

joiner.add("{");

joiner.add("Image-"+product);

joiner.add("}");

params.match(joiner.toString()).count(100);

System.out.println(joiner.toString());

ScanResult<String> scanResult = null;

String scanMarker = "0";

do {

scanResult = jedisCluster.scan(ScanParams.SCAN_POINTER_START, params);

System.out.println(scanResult.getResult());

System.out.println(!(scanResult.getResult() == null || scanResult.getResult().isEmpty()));

} while (!scanMarker.equals("0"));

ScanResult<Map.Entry<String,String>> scan = jedisCluster.hscan(joiner.toString(), ScanParams.SCAN_POINTER_START);

System.out.println(scan.getResult());

在这里,我得到了空值。但是群集节点中存储了一个值。

但是,如果我尝试扫描每个Jedis池,我将得到结果。

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

Set<String>jedisPoolList = jedisPools.keySet();

System.out.println(jedisPools.keySet());

System.out.println(jedisPools.values());

System.out.println(jedisPools.size());

for (String hostAndPort : jedisPoolList) {

String[] parts = hostAndPort.split(":");

String host = parts[0];

int port = Integer.valueOf(parts[1]);

try (Jedis jedis = new Jedis(host, port)) {

ScanParams params = new ScanParams().match("Image-"+product).count(100);

String scanMarker = "0";

ScanResult<String> results = null;

do {

results = jedis.scan(scanMarker, params);

System.out.println("XXXX"+results.getResult());

System.out.println("XXXX"+!(results.getResult() == null || results.getResult().isEmpty()));

} while (!scanMarker.equals("0"));

}

}

为什么JedisCluster扫描方法无法提供正确的结果?我该如何解决这个问题?

注意:我可以jedisCluster.exists(key)用来检查密钥的存在。但是我需要使用扫描,因为我可以对Jedis和JedisCluster使用相同的界面。

回答:

在您的实现中Jedis,您与之匹配Image-MMATest。在获取数据时,它证明了该密钥存储了数据。

但是,在JedisCluster实现中,您已"Image-"+product用花括号括起来。这意味着您实际上在匹配{Image-

MMATest}。您没有得到任何数据,因为该密钥没有存储任何数据。

在JedisCluster中,scan支持仅限于Redis哈希标记模式。Image-

MMATest不是Redis哈希标签兼容模式。因此,您将无法Image-MMATest使用scanJedisCluster。

要通过scanJedisCluster 获取数据,您必须将数据存储在Redis哈希标签兼容模式的密钥上,例如{Image-MMATest}

可以在本文档中找到有关Redis哈希标记的更多详细信息。

以上是 JedisCluster:“扫描密钥”不起作用 的全部内容, 来源链接: utcz.com/qa/426618.html

回到顶部