1.简介
(1).什么是流水线
(2).n个命令和pipeline操作对比
命令 | n个命令操作 | pipeline |
---|---|---|
时间 | n次网络 + n次命令 | 1次网络 + n次命令 |
数据量 | 1条命令 | n条命令 |
(3).注意点
- Redis的命令时间是微秒级别的。
- pipeline每次条数主要控制的是网络时间。
2.客户端实现
(1).非pipeline写法
public class PipelineDemo {
public static void main(String[] args) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxWaitMillis(1000);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "39.105.228.3", 6379);
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
jedis.hset("hashKey" + i, "field" + i, "value" + i);
}
long end = System.currentTimeMillis();
System.out.println("花费时间:" + (end - start) + "毫秒");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
(2).pipeline写法
public class PipelineDemo {
public static void main(String[] args) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
jedisPoolConfig.setMaxWaitMillis(1000);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, "39.105.228.3", 6379);
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
long start = System.currentTimeMillis();
//i为网络传输次数
for (int i = 0; i < 100; i++) {
Pipeline pipeline = jedis.pipelined();
for (int j = i * 100; j < (i + 1) * 100; j++) {
pipeline.hset("hashKey:" + j, "field" + j, "value" + j);
}
}
long end = System.currentTimeMillis();
System.out.println("花费时间:" + (end - start) + "毫秒");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
3.M操作与pipline操作的区别
(1).原生M操作
(2).pipline操作
4.使用建议
- 注意每次pipeline携带的数据量
- pipeline每次只能作用在一个Redis节点上
- M操作与pipeline区别