Jedis管道操作

Jedis管道操作

当我们有10000条数据要存储到redis中,使用原始方式存:

@Test
public void tenThousandTest(){
    Jedis jedis = JedisPoolUtils.getResource();
    long start = System.currentTimeMillis();
    for (int i = 0; i < 10000; i++) {
        jedis.set("i:"+i,"v:"+i);
    }
    System.out.println(System.currentTimeMillis()-start);//大概4秒
    jedis.close();
}

当执行完之后得到时间差,发现用时大概4秒。

为什么redis读写性能优异,却花费了4秒钟?

使用过查看redis性能命令的小伙伴会发现读写的性能能达到100000次/s

据官方的bench-mark数据:读的速度是110000次/s,写的速度是81000次/s

#redis写的性能
redis-benchmark set

#redis读的性能
redis-benchmark get

那为什么在这里执行10000次写却用了4秒钟,是不是redis性能不靠谱啊

其实不然,我们仔细想一下,我们的jedis程序和redis服务器是在不同服务器上,

那Jedis的数据要保存到redis中就要通过网络传输

对于上面代码而言,每写一个就要传一个到redis中,一共要发送10000次,这之间消耗的时间是比较久的,也就对代码执行完之后计算得出的时间产生了影响。

  • 其实redis的读写性能是ok的,其瓶颈在于传输性能上。

那有什么提升jedis传输性能的方法呢

有,Jedis提供了一个pipelined(),也就是管道操作,我们来看升级后的代码

@Test
public void test(){
    Jedis jedis = JedisPoolUtils.getResource();
    Long start = System.currentTimeMillis();
    Pipeline pipelined = jedis.pipelined();
    for (int i = 0; i < 10000; i++) {
        pipelined.set("k:"+i,"v:"+i);
    }
    System.out.println(System.currentTimeMillis()-start);//55毫秒
    jedis.close();
}

最后测试发现执行几乎瞬间完成,用时55毫秒,比4秒提升了70多倍。

为什么管道操作那么快

它将所有操作都打包,一次性发给redis服务器,由原先一万次的传输变为一次传输,大大提高了传输性能,节省了时间。

而redis接收到之后做一万次写入,一万次写入对于redis来说小菜一碟,所以速度提升得如此之快。

posted @ 2022-06-23 22:14  lzy96158  阅读(206)  评论(0)    收藏  举报