jedis源码分析(二)-JedisPool连接池实现

本文介绍了JedisPool连接池的实现方式与应用场景,详细解释了JedisPool的构造方法及内部实现机制,并通过示例代码展示了如何使用JedisPool进行高效的数据存取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一章节我们通过jedis学习了实现存放机制,本章节我们通过jedisPool的操作理解连接池的应用,jedisPool的源码实现。
jedisPool连接池示例
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolUtil {

    private volatile JedisPool pool;
    private Jedis jedis;
    private final String host;
    private final int port;
    private String password;

    public JedisPoolUtil(final String host, final int port) {
        this.host = host;
        this.port = port;
        initPool();
    }

    public JedisPoolUtil(final String host, final int port, final String password) {
        this.host = host;
        this.port = port;
        this.password = password;
        initPool();
    }

    public JedisPool initPool() {
        if (pool == null) {
            if (password != null) {
                JedisPoolConfig config = new JedisPoolConfig();
                config.setMaxIdle(100);
                config.setMaxWaitMillis(1000);
                // 设置空间连接
                config.setMaxIdle(10);
                pool = new JedisPool(config, host, port, 2000, password);
            } else {
                pool = new JedisPool(host, port);
            }
            System.out.println("连接池创建成功");
        }
        return pool;
    }

    public Jedis initJedis() {
        if(jedis==null) {
            jedis = pool.getResource();
        }
        System.out.println("jedis创建成功");
        return jedis;
    }

    public String set(String key, String value) {
        if (jedis == null) {
            jedis = initJedis();
        }
        String result = jedis.set(key, value);
        if ("OK".equals(result)) {
            jedis.close();
        }
        return result;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            JedisPoolUtil jedisPoolUtil = new JedisPoolUtil("127.0.0.1", 4100);
            System.out.println(jedisPoolUtil.set("test" + i, "value" + i));
        }
    }

}

使用jedisPool连接池,实例化jedisPool对象,jedisPool类提供了很多构造方法,可以根据自己的需要去选择构造方法,
  public JedisPool(String host , int port ) {
    this ( new GenericObjectPoolConfig(), host , port , Protocol. DEFAULT_TIMEOUT , null ,
        Protocol. DEFAULT_DATABASE , null );
  }
  public JedisPool ( final GenericObjectPoolConfig poolConfig , final String host , int port ,
      final int connectionTimeout , final int soTimeout , final String password , final int database ,
      final String clientName , final boolean ssl , final SSLSocketFactory sslSocketFactory ,
      final SSLParameters sslParameters , final HostnameVerifier hostnameVerifier ) {
    super ( poolConfig , new JedisFactory( host , port , connectionTimeout , soTimeout , password ,
        database , clientName , ssl , sslSocketFactory , sslParameters , hostnameVerifier ));
  }
  public JedisPool( final GenericObjectPoolConfig poolConfig , final URI uri , final int timeout ,
      final SSLSocketFactory sslSocketFactory , final SSLParameters sslParameters ,
      final HostnameVerifier hostnameVerifier ) {
    this ( poolConfig , uri , timeout , timeout , sslSocketFactory , sslParameters , hostnameVerifier );
  }
  public JedisPool( final GenericObjectPoolConfig poolConfig , final URI uri ,
      final int connectionTimeout , final int soTimeout ) {
    super ( poolConfig , new JedisFactory( uri , connectionTimeout , soTimeout , null , false ,
        null , null , null ));
  }
  public JedisPool( final GenericObjectPoolConfig poolConfig , final URI uri ,
      final int connectionTimeout , final int soTimeout , final SSLSocketFactory sslSocketFactory ,
      final SSLParameters sslParameters , final HostnameVerifier hostnameVerifier ) {
    super ( poolConfig , new JedisFactory( uri , connectionTimeout , soTimeout , null ,
        ( uri .getScheme() != null &&