Redis管道pipeline问题记录

背景:业务中需要经常保存和删除缓存,导致查询接口变慢,为解决这一问题,考虑使用Redis的管道。

管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline通过减少客户端与redis的通信次数来实现降低往返延时时间。

批量存储:

public boolean setPipeline(Map<String, String> paras, Integer expireTime) {
        RedisSerializer keySerializer = redisTemplate.getKeySerializer();
        RedisSerializer valueSerializer = redisTemplate.getValueSerializer();
        redisTemplate.executePipelined((RedisCallback<String>) connection -> {
            for (String key : paras.keySet()) {
                byte[] keyb = keySerializer.serialize(key);
                connection.set(keyb, valueSerializer.serialize(paras.get(key)), Expiration.seconds(expireTime), RedisStringCommands.SetOption.UPSERT);
            }
            return null;
        }, valueSerializer);
        return true;
    }

批量删除:

public boolean removePipeline(List<String> keys) {
 RedisSerializer keySerializer = redisTemplate.getKeySerializer();
    redisTemplate.executePipelined((RedisCallback<String>) connection -> {
        for (String key : keys) {
            connection.del(keySerializer.serialize(key));
        }
        return null;
    }, keySerializer);
    return true;
}

注意:

  1. 参数必须转为byte[],并且内部类返回null。
  2. 参数必须序列化,否则get会报反序列化错误。参考:Redis使用Pipeline时对象序列化失败org.springframework.data.redis.serializer.SerializationException

序列化:

private RedisSerializer<String> keySerializer() {
	return new StringRedisSerializer();
}
private RedisSerializer<Object> valueSerializer() {
	//return new GenericJackson2JsonRedisSerializer();
	return new RedisObjectSerializer();
}

你可能感兴趣的:(缓存,redis,缓存)