可能有些小伙伴使用redis读写数据在需要循环使用的场景会发现效率并不是很高
于是我分享一个pipeline管道方法
我们这里用12万条数据做测试,首先来试试写入操作,看看用常规方法以列表形式写入:
可以看到耗时大约9.2秒
我们再来看看使用pipeline方法进行列表存储,同样是12万条数据:
可以看到,写入12万条数据此时只需要3.6秒
执行时间缩短了大约60%!
我们再来试试读取操作,同样是12万条数据,常规方法进行读取:
可以看到耗时大约是6.6秒
此时我们继续使用管道方法进行读取:
可以看到读取12万条数据耗时大约是2.3秒
执行时间缩短了大约65%!
为什么时间会差这么多呢,因为在for循环里直接使用redis操作,会向redis数据库来回发送多次请求,而pipeline是Redis提供的一种批处理机制,通过将多次请求合并成一次执行,可以有效减少网络请求次数,减少多次IO带来的消耗,速度自然会提升不少
不过需要注意的是:pipeline 期间将 “独占” 链接,此时将不能进行非 “管道” 类型的其他操作,直到 pipeline 关闭。且pipeline数据如果太过庞大,可能会造成内存溢出从而报错:
此时我们就需要对数据进行分割操作或者在php.ini中给php分配更多的内存