1、场景
一个业务需求,需要开发一个业务接口,批量删除 Redis 中数据。这个功能点其实很简单,只要让外部传入需要删除键信息,然后在接口内部遍历调用删除命令即可。按照这个思路,功能很快就开发完成,然后顺利的上线。
上线之后,运行一段时间,调用业务方反馈,当要删除的数据很多的时候,这个接口响应时间就变慢。解决的方法可以使用多线程删除,不过这次使用pipeline 命令
以jedis为连接池,使用pipeline命令
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(100);
poolConfig.setTestOnBorrow(false);
poolConfig.setTestOnReturn(false);
JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", Integer.parseInt("6379"), 60*1000, "1234qwer");
Jedis jedis = jedisPool.getResource();
Pipeline pipelined = jedis.pipelined();
for (int i = 0; i < 100; i++) {
pipelined.set("key" + i, "value" + i);
}
pipelined.sync();
执行pipelined.sync()
,所有命令数据将会统一发送到到 Redis 中,方法调用之后不会返回任何结果,可以执行pipelined.syncAndReturnAll
获取返回值。
2、pipeline实现原理
Redis pipeline
命令的实现,其实需要客户端与服务端同时支持,同时pipeline的管道数也是有限制的,与计算机的缓冲区大小有关,