redis管道操作(节省网络IO开销)
客户端可以一次性发送多个请求而不用等待服务器的响应,待所有命令都发送完后再一次性读取服务的响应,这样可以极大的降低多条命令执行的网络传输开销,管道执行多条命令的网络开销实际上只相当于一次命令执行的网络开销。需要注意到是用pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果,打包的命令越多,缓存消耗内存也越多,所以并不是打包的命令越多越好。
pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的响应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行。
//一次性发送20条redis命令 public static void main(String[] args) { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(10); jedisPoolConfig.setMaxTotal(20); jedisPoolConfig.setMinIdle(5); JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.56.102",6379,3000,null); Jedis jedis = jedisPool.getResource(); Pipeline pipelined = jedis.pipelined(); for (int i = 0; i < 10; i++) { //往管道里面存储命令 pipelined.incr("pipelined_key"); pipelined.set("pipelined_key" + i,String.valueOf(i)); } //发送命令,执行 List<Object> results = pipelined.syncAndReturnAll(); System.out.println(results); //[1, OK, 2, OK, 3, OK, 4, OK, 5, OK, 6, OK, 7, OK, 8, OK, 9, OK, 10, OK] }