RedisTemplate Pipeline批量查询结果为空的原因及解决方法

pipeline批量查询为何返回空值?

当使用redistemplate的pipeline批量查询功能时,获取到的结果却显示为空时,可能是由于以下原因导致:

管道操作结果处理不当

redistemplate的pipeline技术允许缓存命令,然后一次性发送到redis服务器。但在使用管道操作时,命令的结果不会立即返回,而是需要在执行executepipelined方法后才能获取。

因此,在管道操作内部尝试处理命令结果(如直接反序列化)是不可取的,而应该在executepipelined返回的列表中处理命令的响应。

违背管道初衷

在pipeline操作中,循环内对每个键进行获取和反序列化实际上违背了管道技术的初衷,因为这样做并没有减少网络往返次数。

解决方案

正确的处理方法是在executepipelined执行后处理结果,而不是在管道操作中处理:

public  List batchGetList(Collection keys) {
    if (CollectionUtil.isEmpty(keys)) {
        return new ArrayList<>();
    }

    List results = redisTemplate.executePipelined((

RedisConnection connection) -> { RedisSerializer keySerializer = (RedisSerializer) redisTemplate.getKeySerializer(); for (String key : keys) { connection.get(keySerializer.serialize(key)); } return null; }); // 在管道执行外部处理结果 return results.stream() .map(result -> (T) redisTemplate.getValueSerializer().deserialize((byte[]) result)) .collect(Collectors.toList()); }

此方法将所有的get命令作为批量操作发送,并一次性处理所有结果。需要注意的是,上述代码假设所有键对应值均可使用同一反序列化器反序列化。