背景:业务中需要经常保存和删除缓存,导致查询接口变慢,为解决这一问题,考虑使用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;
}
注意:
- 参数必须转为byte[],并且内部类返回null。
- 参数必须序列化,否则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();
}