心得:
/** * 心得: * 1.连接方式主要有:直连同步,直连事务,直连管道,直连管道事务,分布式直连同步,分布式直连管道,分布式连接池同步,分布式连接池管道; * 2.同步方式会返回数据库执行结果,管道则不会返回数据库执行结果; * 3。管道分两种执行方式:有返回命令执行结果,无返回命令执行结果; * 4.返回数据库执行结果 与 返回命令执行结果 不是一个东西; * 5一般管道的无返回命令执行结果 的执行方式会比 有返回结果的方式快一点点,,但是在分布式连接池的测试里则得出相反的结果, * 因此,这两种管道方式的速度差距不大,按使用需求即可。 */测试源码
* redis几种调用方法 */ /** * 普通直连同步写入操作,于myRedis方法一样,都是单实例方法 * * 同步执行,会返回执行结果 * 写入10万行字符串 */ @org.junit.Test public void r1() { Jedis jedis = new Jedis("127.0.0.1", 6379); //密码,如果服务器没有密码,则会报错,因此,要对用使用 //jedis.auth("admin"); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { //返回的是个字符串 String res = jedis.set("n" + i, "n" + i); System.out.println("返回的结果:" + res); //返回的结果:OK } long end = System.currentTimeMillis(); System.out.println("普通同步写入:" + ((end - start) / 1000.0) + "秒"); jedis.close(); }//结果://普通同步写入:5.792秒 /** * 普通批量事物提交,, REDIS事物不支持回滚 * 同步执行,会返回执行结果 * 写入10万行字符串 */ @org.junit.Test public void r2() { Jedis jedis = null; try { jedis = new Jedis("127.0.0.1", 6379); long start = System.currentTimeMillis(); //事务类型的参数 , REDIS事物不支持回滚 Transaction transaction = jedis.multi(); for (int i = 0; i < 100000; i++) { //没有返回值 transaction.set("n" + i, "n" + i); } //执行事务,返回执行的命令结果 List<Object> res = transaction.exec();// System.out.println("操作成功条数:" + res.size()); long end = System.currentTimeMillis(); System.out.println("普通批量事物写入:" + ((end - start) / 1000.0) + "秒"); //断开连接 jedis.disconnect(); } catch (Exception e) { e.printStackTrace(); } finally { if (jedis != null) { System.out.println("未关闭"); jedis.close(); System.out.println("关闭成功"); } else { System.out.println("已关闭"); } }// 操作成功条数:100000// 普通批量事物写入:0.443秒// 未关闭// 关闭成功 } /** * 普通异步管道提交,不需要等待执行完成后的结果 */ @org.junit.Test public void r3() { Jedis jedis = null; try { jedis = new Jedis("127.0.0.1", 6379); long start = System.currentTimeMillis(); Pipeline pipeline = jedis.pipelined(); for (int i = 0; i < 100000; i++) { //没有返回值 pipeline.set("n" + i, "n" + i); }// //跟批量事务提交速度一样,syncAndReturnAll()会返回结果,花费0.406秒// List<Object> res = pipeline.syncAndReturnAll();// System.out.println("返回的结果条数:"+res.size()); //无结果返回,速度更快一点点,0.334秒左右即可 pipeline.sync(); long end = System.currentTimeMillis(); System.out.println("普通异步管道提交:" + ((end - start) / 1000.0) + "秒"); //断开连接 jedis.disconnect(); } catch (Exception e) { e.printStackTrace(); } finally { if (jedis != null) { System.out.println("未关闭"); jedis.close(); System.out.println("关闭成功"); } else { System.out.println("已关闭"); } } } /** * 在异步管道中使用事务 * 效率和单独使用事务差不多 */ @org.junit.Test public void r4() { Jedis jedis = null; try { jedis = new Jedis("127.0.0.1", 6379); long start = System.currentTimeMillis(); Pipeline pipeline = jedis.pipelined(); //管道开启事务 pipeline.multi(); for (int i = 0; i < 100000; i++) { //没有返回值 pipeline.set("n" + i, "n" + i); } //执行事务 pipeline.exec();// //执行管道,返回执行的命令结果,,花费时间0.413秒// List<Object> res = pipeline.syncAndReturnAll();//// for (Object ob:res){//// System.out.println(ob);//// }//// System.out.println("返回的结果条数:" + res.size()); //无返回值,花费的时间0.366秒 pipeline.sync(); long end = System.currentTimeMillis(); System.out.println("普通异步管道提交:" + ((end - start) / 1000.0) + "秒"); //断开连接 jedis.disconnect();// 普通异步管道提交:0.334秒 } catch (Exception e) { e.printStackTrace(); } finally { if (jedis != null) { System.out.println("未关闭"); jedis.close(); System.out.println("关闭成功"); } else { System.out.println("已关闭"); } } } /** * 分布式直连,普通同步操作 * 与普通的单例连接速度一样 */ @org.junit.Test public void r5() { long start = System.currentTimeMillis(); //生产环境下,这里一般换成不同的ip,也就是说,使用从机 List<JedisShardInfo> shardInfos = Arrays.asList( new JedisShardInfo("127.0.0.1", 6379), new JedisShardInfo("127.0.0.1", 6379)); ShardedJedis shardedJedis = new ShardedJedis(shardInfos); for (int i = 0; i < 100000; i++) { //返回的是个字符串 String res = shardedJedis.set("n" + i, "n" + i);// System.out.println("返回的结果:" + res); //返回的结果:OK } long end = System.currentTimeMillis(); System.out.println("分布式直连:" + ((end - start) / 1000.0) + "秒"); //断开连接 shardedJedis.disconnect(); //关闭连接 shardedJedis.close(); // 分布式直连:5.254秒 } /** * 分布式直连,使用管道 * <p> * 十万条数据花费0.457秒 */ @org.junit.Test public void r6() { long start = System.currentTimeMillis(); //生产环境下,这里一般换成不同的ip,也就是说,使用从机 List<JedisShardInfo> shardInfos = Arrays.asList( new JedisShardInfo("127.0.0.1", 6379), new JedisShardInfo("127.0.0.1", 6379)); ShardedJedis shardedJedis = new ShardedJedis(shardInfos); //开启异步管道 ShardedJedisPipeline shardedJedisPipeline = shardedJedis.pipelined(); for (int i = 0; i < 100000; i++) { shardedJedisPipeline.set("n" + i, "n" + i); } //有返回结果的执行方式,其实是个以队列的形式发送命令,然后返回执行命令结果 List<Object> list = shardedJedisPipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("分布式管道:" + ((end - start) / 1000.0) + "秒"); shardedJedis.disconnect(); shardedJedis.close(); // 分布式管道:0.457秒 } /** * 分布式连接池,适合多线程 * <p> * 同步调用 */ @org.junit.Test public void r7() { long start = System.currentTimeMillis(); //生产环境下,这里一般换成不同的ip,也就是说,使用从机 List<JedisShardInfo> shardInfos = Arrays.asList( new JedisShardInfo("127.0.0.1", 6379), new JedisShardInfo("127.0.0.1", 6379)); //new JedisPoolConfig() 表示默认设置,可以自定义设置属性参数,这里不展示 ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shardInfos); ShardedJedis shardedJedis = pool.getResource(); for (int i = 0; i < 100000; i++) { //返回的是个字符串 String res = shardedJedis.set("n" + i, "n" + i);// System.out.println("返回的结果:" + res); //返回的结果:OK } pool.returnResource(shardedJedis); long end = System.currentTimeMillis(); System.out.println("分布式连接池,同步调用:" + ((end - start) / 1000.0) + "秒"); //销毁连接池 pool.destroy(); //断开连接,这个可写可不写 shardedJedis.disconnect(); //关闭连接 //不可以在这里使用shardedJedis.close(); //否则会报错redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool//// //分布式连接池,同步调用:5.419秒 } /** * 分布式连接池,异步管道调用 */ @org.junit.Test public void r8(){ long start = System.currentTimeMillis(); //生产环境下,这里一般换成不同的ip,也就是说,使用从机 List<JedisShardInfo> shardInfos = Arrays.asList( new JedisShardInfo("127.0.0.1", 6379), new JedisShardInfo("127.0.0.1", 6379)); //new JedisPoolConfig() 表示默认设置,可以自定义设置属性参数,这里不展示 ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shardInfos); ShardedJedis shardedJedis = pool.getResource(); //开启管道 ShardedJedisPipeline pipeline = shardedJedis.pipelined(); for (int i = 0; i < 100000; i++) { pipeline.set("n" + i, "n" + i); }// //有返回结果的执行方式,其实是个以队列的形式发送命令,然后返回执行命令结果// List<Object> list = pipeline.syncAndReturnAll(); //无结果返回 pipeline.sync(); pool.returnResource(shardedJedis); long end = System.currentTimeMillis(); System.out.println("分布式连接池,异步管道调用:" + ((end - start) / 1000.0) + "秒"); //销毁连接池 pool.destroy(); //断开连接,这个可写可不写 shardedJedis.disconnect(); //关闭连接 //不可以在这里使用shardedJedis.close(); //否则会报错redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool//// //有返回结果的执行方式 //分布式连接池,异步管道调用:0.49秒 // //无结果返回执行方式 //分布式连接池,异步管道调用:0.517秒 }
来源:https://www.cnblogs.com/c2g5201314/p/12216892.html