;
通道技术批量插入数据和普通插入效率对比:
package com.daxin.jedis_datastructure;
import java.util.List;
import java.util.UUID;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
* @author daxin
* @email leodaxin@163com
* @date 2017年9月13日 下午1:34:44
* 2291 129072
public class JedisPip {
Jedis jedis = null;
@Before
public void before() {
jedis = RedisUtils.getJedis();
jedis.flushDB();
@After
public void after() {
jedis.close();
@Test
public void pipe_jedis() {
Pipeline pip = jedis.pipelined();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
pip.set(UUID.randomUUID().toString(), UUID.randomUUID().toString());
pip.sync();// 同步获取所有的回应
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
jedis.set(UUID.randomUUID().toString(), UUID.randomUUID().toString());
System.out.println(System.currentTimeMillis() - start);
输出时间分别是:
129072
可以看到使用通道技术插入有较高的效率。产生差距的原因:
Redis 管道技术
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:
客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端。
Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。
管道技术的优势
管道技术最显著的优势是提高了 redis 服务的性能。
使用管道技术获取结果:
@Test
public void pipe_get() {
Pipeline pip = jedis.pipelined();
pip.multi();
for (int i = 0; i < 100000; i++) {
pip.set(i + "", UUID.randomUUID().toString());
Response<List<Object>> r = pip.exec();
pip.multi();
for (int i = 0; i < 100000; i++) {
pip.get("" + i);
r = pip.exec();
pip.sync();// 调用syn会关闭管道,所以在调用syn之后就不可以在使用管道了
System.out.println(r.get().get(0));
System.out.println(r.get().size());