一、概念
1、redis的通信实质
Redis 使用的是客户端-服务器(CS)模型和请求/响应协议的 TCP 服务器;
Redis 客户端与 Redis 服务器之间使用 TCP 协议进行连接;当一个客户端通过一个 socket 连接发起多个请求命令时,每个请求命令发出后 client 通常会阻塞并等待 redis 服务器处理,当redis 服务器处理完请求命令后会将结果通过响应报文返回给 client,所以当执行多条命令的时候都需要等待上一条命令执行完毕才能执行下一条命令。
2、什么是一条redis命令执行完毕
client发送命令 --> 命令排队 --> 服务端命令执行 --> 返回结果
3、pipeline的通信实质
管道(pipeline)可以一次性发送多条命令到服务端并在执行完后一次性将结果返回给客户端;
4、pipeline的优点
pipeline通过减少客户端与 redis 的通信次数来实现降低往返延时时间;
pipeline 实现的原理是队列,而队列的原理是时先进先出,这样可以保证数据的顺序性。
5、图解redis执行N条命令
6、图解pipeline执行N条命令
二、对比使用效率
package com.cn.util
import redis.clients.jedis.JedisPool
object RedisUtils {
private val host = "master"
private val port = 6379
//private val poolConfig = new GenericObjectPoolConfig()
lazy val pool = new JedisPool(host, port)
//关闭
lazy val hooks = new Thread() {
override def run(): Unit = {
println("Execute hook thread: " + this)
pool.destroy()
}
}
}
package com.cn.test
import java.util
import com.cn.util.RedisUtils
object Redis_pipeline {
def main(args: Array[String]): Unit = {
val jedis = RedisUtils.pool.getResource
jedis.auth("123456")
var t1=System.currentTimeMillis()
jedis.select(1)
for(i<-0 to 100000){
val map= new util.HashMap[String,String]()
map.put(i+"k",i+"v")
jedis.hmset(i+"key",map)
}
var t2=System.currentTimeMillis()
println("jedis总用时间:"+(t2-t1)+"ms")
var t3=System.currentTimeMillis()
val pipeline = jedis.pipelined()
pipeline.select(2)
for(i<-0 to 100000){
val map= new util.HashMap[String,String]()
map.put(i+"k",i+"v")
pipeline.hmset(i+"key",map)
}
//将命令打包统一提交
pipeline.sync()
//将命令打包统一提交,并返回想要的结果
//val list = pipeline.syncAndReturnAll()
var t4=System.currentTimeMillis()
println("pipeline总用时间:"+(t4-t3)+"ms")
}
}
jedis总用时间:21685ms
pipeline总用时间:225ms