redis之pipeline批量存储
2019-05-17 本文已影响9人
山东大葱哥
pipeline是redis批量提交的一种方式,也就是把多个命令操作建立一次连接发给redis去执行,在性能方面会比循环的单次提交会好很多。
性能对比
循环的单次提交
代码如下:
public void testOne() {
long begin = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
redisTemplate.boundValueOps(i + "a").set(i);
}
long end = System.currentTimeMillis();
System.out.println("每次都连接耗时:" + (end - begin) + "毫秒");
}
耗时情况:
每次都连接耗时:2954毫秒
使用pipeline的一次提交
代码
public void testPipeline() {
long begin = System.currentTimeMillis();
redisTemplate.executePipelined(new RedisCallback<Long>() {
public Long doInRedis(RedisConnection connection) throws DataAccessException {
connection.openPipeline();
for (int i = 0; i < 10000; i++) {
byte[] key = ("pipeline" + i ).getBytes();
byte[] value = ("pipeline" + i ).getBytes();
connection.set(key, value);
}
//connection.closePipeline();
return null;
}
});
long end = System.currentTimeMillis();
System.out.println("一次连接耗时:" + (end - begin) + "毫秒");
}
耗时情况:
一次连接耗时:87毫秒
结论
可见性能提升是很明显的。
另外直接使用jedis的pipeline,你会发现速度更快一些。
注意点
字节类型参数
注意在使用pipeline以后,在回调方法中我们需要使用原生的redis接口,而其中大部分都是字节型的参数,需要我们进行转换获取字节流,然后进行存储或读取。
存取的内容如何读取
通过pipeline方式存取的key,在使用redisTemplate读取时会遇到Null的问题,这是由于key值序列化的方法不一样造成的,为了避免这种情况,我们可以对redisTemplate进行设置,代码如下
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
以后就可以通过
redisTemplate.boundValueOps("pipeline0").get()
轻松读取pipeline存储的内容了。