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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值