`

3.通过Jedis访问Redis——八种调用方式

 
阅读更多
package com.gqshao.redis.connection;

import org.junit.Test;
import redis.clients.jedis.*;

import java.util.Arrays;
import java.util.List;

/**
 * Redis的Java客户端Jedis的八种调用方式
 */
public class ConnectionTest {

    /**
     * 普通连接方式
     * Simple SET: 95.437 seconds
     */
    @Test
    public void testNormal() {
        Jedis jedis = new Jedis("192.168.3.98", 6379);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            String result = jedis.set("n" + i, "n" + i);
        }
        long end = System.currentTimeMillis();
        System.out.println("Simple SET: " + ((end - start) / 1000.0) + " seconds");
        // 销毁
        jedis.close();
    }

    /**
     * 普通连接池方式
     * POOL SET: 99.789 seconds
     *
     */
    @Test
    public void testSimplePool() {
        JedisPool pool = new JedisPool(new JedisPoolConfig(), "192.168.3.98", 6379, 0);
        Jedis jedis = pool.getResource();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            String result = jedis.set("np" + i, "vp" + i);
        }
        long end = System.currentTimeMillis();
        pool.returnResource(jedis);
        System.out.println("POOL SET: " + ((end - start) / 1000.0) + " seconds");
        // 销毁
        jedis.close();
    }

    /**
     * 事务方式(Transactions)
     * 通过multi(开启一个事务)、exec(执行)、discard(放弃事务)
     * Transaction SET: 0.926 seconds
     */
    @Test
    public void testMulti() {
        Jedis jedis = new Jedis("192.168.3.98", 6379);
        long start = System.currentTimeMillis();
        Transaction tx = jedis.multi();
        for (int i = 0; i < 100000; i++) {
            tx.set("t" + i, "v" + i);
        }
        List<Object> results = tx.exec();
        long end = System.currentTimeMillis();
        System.out.println("Transaction SET: " + ((end - start) / 1000.0) + " seconds");
        jedis.close();
    }

    /**
     * 管道(Pipelining)
     * 异步方式,一次发送多个指令
     * Pipelined SET: 0.742 seconds
     */
    @Test
    public void testPipelining() {
        Jedis jedis = new Jedis("192.168.3.98", 6379);
        Pipeline pipeline = jedis.pipelined();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            pipeline.set("p" + i, "p" + i);
        }
        List<Object> results = pipeline.syncAndReturnAll();
        long end = System.currentTimeMillis();
        System.out.println("Pipelined SET: " + ((end - start) / 1000.0) + " seconds");
        jedis.close();
    }

    /**
     * 管道中调用事务
     * 测试中会发生 java.lang.StackOverflowError
     */
    @Test
    public void testPipeliningWithMulti() {
        Jedis jedis = new Jedis("192.168.3.98", 6379);
        long start = System.currentTimeMillis();
        Pipeline pipeline = jedis.pipelined();
        pipeline.multi();
        // >10000次会内存溢出
        /*for (int i = 0; i < 100000; i++) {
            pipeline.set("" + i, "" + i);
        }*/
        for (int i = 0; i < 1000; i++) {
            pipeline.set("" + i, "" + i);
        }
        pipeline.exec();
        List<Object> results = pipeline.syncAndReturnAll();
        long end = System.currentTimeMillis();
        System.out.println("Pipelined transaction: " + ((end - start) / 1000.0) + " seconds");
        jedis.close();
    }

    /**
     * 分布式直接连接同步调用
     * 通过List<JedisShardInfo>中Info的顺序和key,计算hash,确定key为固定的Redis上
     * Simple@Sharing SET: 95.106 seconds
     */
    @Test
    public void testshardNormal() {
        List<JedisShardInfo> shards = Arrays.asList(
                new JedisShardInfo("192.168.3.98", 6379),
                new JedisShardInfo("192.168.3.98", 6380));

        ShardedJedis sharding = new ShardedJedis(shards);

        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            String result = sharding.set("sn" + i, "n" + i);
        }
        long end = System.currentTimeMillis();
        System.out.println("Simple@Sharing SET: " + ((end - start) / 1000.0) + " seconds");

        sharding.close();
    }

    /**
     * 分布式直接连接管道异步调用,key的分配结果同 分布式直接连接同步调用 相同
     * Pipelined@Sharing SET: 0.856 seconds
     */
    @Test
    public void testshardPipelining() {
        List<JedisShardInfo> shards = Arrays.asList(
                new JedisShardInfo("192.168.3.98", 6379),
                new JedisShardInfo("192.168.3.98", 6380));

        ShardedJedis sharding = new ShardedJedis(shards);
        ShardedJedisPipeline pipeline = sharding.pipelined();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            pipeline.set("sp" + i, "p" + i);
        }
        List<Object> results = pipeline.syncAndReturnAll();
        long end = System.currentTimeMillis();
        System.out.println("Pipelined@Sharing SET: " + ((end - start) / 1000.0) + " seconds");

        sharding.close();
    }

    /**
     * 分布式连接池同步调用
     */
    @Test
    public void testShardSimplePool() {
        List<JedisShardInfo> shards = Arrays.asList(
                new JedisShardInfo("192.168.3.98", 6379),
                new JedisShardInfo("192.168.3.98", 6380));

        ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

        ShardedJedis one = pool.getResource();

        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            String result = one.set("spn" + i, "n" + i);
        }
        long end = System.currentTimeMillis();
        pool.returnResource(one);
        System.out.println("Simple@Pool SET: " + ((end - start) / 1000.0) + " seconds");

        pool.destroy();
    }

    /**
     * 分布式连接池异步调用相同,返回管道与分布式直接连接管道异步调用
     * Simple@Pool SET: 94.094 seconds
     */
    @Test
    public void testShardPoolWithPipelined() {
        List<JedisShardInfo> shards = Arrays.asList(
                new JedisShardInfo("localhost", 6379),
                new JedisShardInfo("localhost", 6380));

        ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);

        ShardedJedis one = pool.getResource();

        ShardedJedisPipeline pipeline = one.pipelined();

        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            pipeline.set("sppn" + i, "n" + i);
        }
        List<Object> results = pipeline.syncAndReturnAll();
        long end = System.currentTimeMillis();
        pool.returnResource(one);
        System.out.println("Pipelined@Pool SET: " + ((end - start) / 1000.0) + " seconds");
        pool.destroy();
    }


}

 

0
0
分享到:
评论
1 楼 s33ker 2015-01-09  
这么多调用方法,为嘛时间是能差别这么大,那哪一种是项目中用的

相关推荐

    jedis.zip——java开发redis的工具类

    开发者可以根据需求调用这些方法来执行相应的Redis命令,而无需直接与Jedis实例交互,从而降低了代码的复杂性并提高了可维护性。 `JedisProvider`则扮演着提供Jedis实例的角色,它负责初始化和管理Jedis连接。考虑...

    Jedis源码-供查询redis API源码

    例如,当我们调用`Jedis.set(key, value)`时,实际上Jedis会构造Redis命令字符串`SET key value`,然后通过网络发送到Redis服务器。命令响应也会被解析成Java对象返回。 对于更复杂的操作,如`Jedis.hgetAll(key)`...

    28拓展 7:妙手仁心 —— 优雅地使用 Jedis(1).md

    为了减少这种人为错误,可以采用封装JedisPool的方式,强制程序员通过一个中间层来访问Jedis实例。通过自定义的RedisPool类,程序员在使用Jedis时必须通过CallWithJedis接口来传递需要执行的操作,这样就能保证每次...

    Redis学习-实战.docx

    - **基本操作**:通过 `Jedis` 对象调用方法,如 `set`、`get` 等。 #### 五、总结 Redis 作为一种高性能的非关系型数据库,在实际应用中扮演着重要的角色。通过对 Redis 的学习和实战,可以有效地解决缓存问题,...

    Redis的两个框架:Jedis与Redisson1

    在Java开发中,有两个主流的Redis客户端框架——Jedis和Redisson,它们分别提供了不同的特性和使用方式。 **1. Jedis** Jedis是Redis的原生Java客户端,它的API设计紧密贴合Redis命令,提供了对Redis所有命令的直接...

    基于Redis实现分布式应用限流的方法

    3. 灵活性:可以通过调整Redis数据结构中的参数来适应不同的限流需求。 但同时,需要注意的是,Redis本身不是无状态的,因此在多实例部署时,需要考虑数据一致性问题,例如使用Sentinel或Cluster来确保高可用性。...

    jedis-2.9.0.jar

    - **标题**:“jedis-2.9.0.jar”——这指的是 Jedis 库的一个特定版本(2.9.0),它是用于与 Redis 数据库进行交互的 Java 客户端库。 - **描述**:描述中提到的内容主要集中在如何开始在 Java 中使用 Redis,并...

    redis+spring+maven

    5. **Jedis与Lettuce客户端**: Spring Data Redis 支持Jedis和Lettuce两种Redis客户端,你可以根据需求选择适合的客户端库。 最后,Maven在其中的作用主要体现在项目管理和依赖管理上: 1. **依赖管理**: 在`pom....

    tomcat-redis-session共享

    为了解决这个问题,一种常见的解决方案是使用集中式的session存储服务,如Redis,来实现session数据的共享。本文将详细介绍如何在Tomcat环境下利用Redis实现session共享。 #### 二、环境搭建与配置 **1. 测试环境*...

    springboot搭建

    SpringBoot 搭建——整合 Redis 与 MyBatis 的实战指南 在现代的 Java 开发中,Spring Boot 已经成为了快速构建应用的首选框架,它极大地简化了 Spring 应用的初始设置和配置。本教程将详细介绍如何使用 Spring ...

    verifi_code.rar

    在Java应用中,我们首先需要在项目中引入Jedis的依赖,然后通过Jedis实例连接到Redis服务器。基本操作包括设置键值对(`set(key, value)`)和获取键对应的值(`get(key)`)。在这个验证码场景中,我们可以用用户的...

    Spring Boot+Redis 分布式锁:模拟抢单.pdf

    文中提到了一个非常实用的工具库——jedis,这是Java应用中操作Redis的一个客户端库。通过在项目中引入jedis的依赖,可以方便地在Java代码中执行Redis命令。例如,创建一个分布式锁的操作可以通过调用`setnx`方法...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题80:java访问redis级redis集群?.mp4 │ Java面试题81:微信公众号分类和微信开发原理.mp4 │ Java面试题82:怎么把微信和业务平台进行绑定.mp4 │ Java面试题83:项目的分类和项目参与者.mp4 │ Java...

    开发常用jar3

    5. **stax**:Streaming API for XML(STAX)是Java中处理XML的一种低级别的、事件驱动的API,它允许程序员通过迭代器逐事件地读取和写入XML流,提供了高效的XML处理方式。 6. **redis**:Redis是一个开源的、高...

    myredis-spring-boot-starter.zip

    myredis-spring-boot-starter也不例外,它包含了一组与Redis相关的依赖库,如Jedis、Lettuce等,以及Spring Boot的自动配置类,这些配置类会根据应用的环境自动配置Redis的相关设置。 在使用myredis-spring-boot-...

    互联网后端基础设施架构.pdf

    缓存框架,如RedisTemplate和Jedis,用于管理和优化Redis、Memcached等缓存服务,提升数据访问速度。 接着,缓存、数据库、搜索引擎和消息队列是业务性能的关键。缓存能有效解决热点数据访问问题,提高查询性能。...

Global site tag (gtag.js) - Google Analytics