java调用redis的多种方式与心得

怎甘沉沦 提交于 2020-01-20 10:57:51

心得:

/** * 心得: * 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秒    }

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!