Jedis连接池:

package com.daxin.jedis_datastructure;

/**
*
* @author daxin
*
* @email leodaxin@163com
*
* @date 2017年9月4日 上午10:29:00
*
*/
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; public class RedisUtils { // Redis服务器IP
private static String ADDR = "node";
// Redis的端口号
private static int PORT = 6379;
// 可用连接实例的最大数目,默认值为8;
// 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static int MAX_ACTIVE = 16;
// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 6;
// 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = 10000; // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获取Jedis实例
*
* @return
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

通道技术批量插入数据和普通插入效率对比:

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);
} }

输出时间分别是:

2291
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()); }

Jedis使用管道优化批量输出插入的效率的更多相关文章

  1. 【转】MySQL批量SQL插入各种性能优化

    原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...

  2. JMeter 利用Jmeter批量数据库插入数据

    利用Jmeter批量数据库插入数据   by:授客 QQ:1033553122 1.   启动Jmeter 2.   添加 DBC Connection Configuration 右键线程组-> ...

  3. php+mysqli实现批量执行插入、更新及删除数据的方法

    本文实例讲述了php+mysqli实现批量执行插入.更新及删除数据的方法.分享给大家供大家参考.具体如下: mysqli批量执行插入/更新/删除数据,函数为 multi_query(). 下面的代码只 ...

  4. 怎么优化JAVA程序的执行效率和性能?

    现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...

  5. 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  6. Hibernate批处理操作优化 (批量插入、更新与删除)

    问题描述 我开发的网站加了个新功能:需要在线上处理表数据的批量合并和更新,昨天下午发布上线,执行该功能后,服务器的load突然增高,变化曲线异常,SA教育了我一番,让我尽快处理,将CPU负载降低. 工 ...

  7. StackExchange.Redis 管道 批量 高性能插入数据

    现在用redis来做数据缓存的越来越多了,很多项目都有初始化redis数据的过程,由于初始化的数据比较大,那么该过程越快越好.这里我们以HashSet方法为例, 这里我们推荐用HashEntry[] ...

  8. MySQL批量SQL插入性能优化

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...

  9. Mysql优化批量插入数据

    最近为了测试项目,需要在Mysql中插入百万级测试数据,于是用到了批量插入,自己写了个简单的Spring Cloud项目. 开始时执行效率很慢,大概100条/秒,批次的大小也试过1000,2000,5 ...

随机推荐

  1. java中Map集合的理解

    Map |--Hashtable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.jdk1.0.效率低. |--HashMap:底层是哈希表数据结构,允许使用 null 值和 ...

  2. [转] can not find module @angular/animations/browser

    本文转自:https://blog.csdn.net/yaerfeng/article/details/68956298 angularjs4升级了,原来的animations现在被单独出来一个包. ...

  3. C# .aspx 页面更换命名空间

    1.选中命名空间,右键单击,选择重构,之后选择重命名.如下图: 2.弹出重命名对话框 3.重写你需要的名字,点击确定. 4.这里重点注意了,不可直接点击应用,否则你会后悔的.你必须对应的看看那个是否是 ...

  4. Receiver 和 Direct方式的区别

    Kafka direct 跟receiver 方式接收数据的区别? Receiver是使用Kafka的高层次Consumer API来实现的.Receiver从Kafka中获取的数据都是存储在Spar ...

  5. Java学习笔记之——冒泡排序

    冒泡排序:解决数组的排序问题,比如从大到小或者从小到大 原理:两两比较 案例:

  6. 【Spring】24、<load-on-startup>0</load-on-startup>配置

    load-on-startup标记容器是否在启动的时候实例化并调用其init()方法的优先级. 它的值表示servlet应该被载入的顺序 当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个s ...

  7. 【Java面试】1、基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充. 源码分享:https: ...

  8. homebrew 安装 formula 的不同历史版本——以安装 node 为例

    homebrew 安装 formula 的不同历史版本--以安装 node 为例 系统环境 macOS Mojave 10.14 Homebrew 1.8.0 Homebrew/homebrew-co ...

  9. 使用volley上传多张图片,一个参数对应多张图片,转载

    https://my.oschina.net/u/1177694/blog/491834 原帖地址 而如果使用volley的话,因为请求数据那些都很简便,但遇到上传文件就麻烦那可不好,同时使用多个网络 ...

  10. 《Inside C#》笔记(完) 程序集

    程序集内部包含了各种相关的模块.资源文件.配置文件等,将这些在功能上相关的文件整合到单个文件中,以便于部署和维护.使用C#编译器编译程序时,生成的便是程序集. 一.清单数据 a)如果编译的是独立应用程 ...