【RedisCluster】redis-cluster mget测试


测试用例:

@Test
    void redisMgetTest(){
        List<String> list=new ArrayList();
        list.add("lcc");
        list.add("ccl");
        list.add("clc");
        List<Object> res=redisTemplate.opsForValue().multiGet(list);
        for (Object o:res){
            System.out.println(o);
        }
    }

 执行结果:

 

还是能跑的,调试看一下是怎么玩的吧

 

先判断是否在同一个slot,如果是的话估计就和standalone一样,如果不是交给

org.springframework.data.redis.connection.ClusterCommandExecutor#executeMultiKeyCommand:

/**
	 * Run {@link MultiKeyClusterCommandCallback} with on a curated set of nodes serving one or more keys.
	 *
	 * @param cmd must not be {@literal null}.
	 * @return never {@literal null}.
	 * @throws ClusterCommandExecutionFailureException
	 */
	public <S, T> MultiNodeResult<T> executeMultiKeyCommand(MultiKeyClusterCommandCallback<S, T> cmd,
			Iterable<byte[]> keys) {

		Map<RedisClusterNode, PositionalKeys> nodeKeyMap = new HashMap<>();

		int index = 0;
          //聚合每个node下面所有的key for (byte[] key : keys) { for (RedisClusterNode node : getClusterTopology().getKeyServingNodes(key)) { nodeKeyMap.computeIfAbsent(node, val -> PositionalKeys.empty()).append(PositionalKey.of(key, index++)); } }
          //用并行的方式请求各个redis-server Map<NodeExecution, Future<NodeResult<T>>> futures = new LinkedHashMap<>(); for (Entry<RedisClusterNode, PositionalKeys> entry : nodeKeyMap.entrySet()) { if (entry.getKey().isMaster()) { for (PositionalKey key : entry.getValue()) { futures.put(new NodeExecution(entry.getKey(), key), executor.submit(() -> executeMultiKeyCommandOnSingleNode(cmd, entry.getKey(), key.getBytes()))); } } } return collectResults(futures); }

 可以看到这里的实现方式是我们上篇文章提到的并行I/O请求的方式,而不是hash_tag(不是很理解这个)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM