我试图扫描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使用相同的界面。
jedisCluster.exists(key)
第1部分:
在您的实现中Jedis,您与之匹配Image-MMATest。在获取数据时,它证明了该密钥存储了数据。
Jedis
Image-MMATest
但是,在JedisCluster实现中,您已"Image-"+product用花括号括起来。这意味着您实际上在匹配{Image- MMATest}。您没有得到任何数据,因为该密钥没有存储任何数据。
JedisCluster
"Image-"+product
{Image- MMATest}
第2部分:
在JedisCluster中,scan支持仅限于Redis哈希标记模式。Image- MMATest不是Redis哈希标签兼容模式。因此,您将无法Image-MMATest使用scanJedisCluster。
scan
Image- MMATest
要通过scanJedisCluster 获取数据,您必须将数据存储在Redis哈希标签兼容模式的密钥上,例如{Image-MMATest}。
{Image-MMATest}
可以在本文档中找到有关Redis哈希标记的更多详细信息。