Redis:Jedis连接池JedisPool[通俗易懂]

Redis:Jedis连接池JedisPool[通俗易懂]目录1、JedisPool的应用1.1基本应用1.2封装应用1.3增加超时重试2、JedisPool配置2.1工厂配置2.2资源池配置Jedis提供了连接池JedisPool。由于Jedis对象不是线程安全的,所以一般会从连接池中取出一个Jedis对象独占,使用完毕后再归还给连接池。maven依赖:<!–https://mv…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目录

1、JedisPool的应用

1.1 基本应用

1.2 封装应用

1.3 增加超时重试

2、JedisPool配置

2.1 工厂配置

2.2 资源池配置


  Jedis提供了连接池JedisPool。由于Jedis对象不是线程安全的,所以一般会从连接池中取出一个Jedis对象独占,使用完毕后再归还给连接池。

    maven依赖:

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

1、JedisPool的应用

1.1 基本应用

    资源池简单应用代码示例:

// 获取连接池
JedisPool pool = new JedisPool();
// 从资源池中拿出可以链接对象
// 用try-with-resource自动调用close方法归还资源
try(Jedis jedis = pool.getResource();) {
// 应用程序执行操作

}

1.2 封装应用

    上述写法,如果使用者没有使用try-with-resource并且忘记了归还资源,可以对JedisPool做一层封装,将归还资源的操作封装起来。

1、资源池:

public class RedisPool {

    private JedisPool pool;

    public RedisPool() {
        this.pool = new JedisPool();
    }

    /**
     * 执行任务
     *
     * @param callable
     */
    public void execute(RedisCallable callable) {
        try(Jedis jedis = pool.getResource()) {
            callable.call(jedis);
        }
    }
}

2、回调接口:

public interface RedisCallable {

    /**
     * 回调方法,执行需要执行的任务
     *
     * @param jedis jedis
     */
    void call(Jedis jedis);
}

3、使用:

public class RedisMain {

    public static void main(String[] args) {
        RedisPool pool = new RedisPool();
        pool.execute((jedis) -> {
            System.out.println(jedis.get("key"));
        });
    }
}

1.3 增加超时重试

    网络抖动情况下,需要增加超时重试机制,在捕获到JedisConnectionException时可以进行重试。

    可以按如下方式改造资源池:

public class RedisPool {

    /**
     * 最大重试次数
     */
    private static final int MAX_RETRY = 3;

    private JedisPool pool;

    public RedisPool() {
        this.pool = new JedisPool();
    }

    /**
     * 执行任务
     *
     * @param callable
     */
    public void execute(RedisCallable callable) {
        int count = 0;
        try (Jedis jedis = pool.getResource()) {
            execute(callable, jedis, count);
        }
    }

    private void execute(RedisCallable callable, Jedis jedis, int count) {
        try {
            callable.call(jedis);
        } catch (JedisConnectionException e) {
            if (count < MAX_RETRY) {
                execute(callable, jedis, ++count);
            } else {
                throw e;
            }
        }
    }
}

2、JedisPool配置

    JedisPool入参最多的构造器:

  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) {
    super(poolConfig, new JedisFactory(host, port, connectionTimeout, soTimeout, password,
        database, clientName));
  }

    上述参数可以分成两部分:资源池配置,以及工厂配置。

2.1 工厂配置

    JedisFactory的主要功能为管理(创建,关闭,验证)redis的连接客户端jedis。从连接池获取jedis连接资源,实际上看是从JedisPool的父类pool中获取,而pool又委托给JedisFactory,最后由JedisFactory创建redis连接客户端jedis。

  1. host:目标服务实例的域名或ip
  2. port:目标服务器的端口(Redis默认端口号是6379)
  3. connectionTimeout:连接超时时间
  4. soTimeout:socket超时时间
  5. password:密码
  6. database:数据库
  7. clientName:生产的客户端实例名称

2.2 资源池配置

    资源池JedisPool使用GenericObjectPool的实例来传入配置,而GenericObjectPool是BaseGenericObjectPool的子类。

    核心参数:

  • maxTotal:最大连接数;
  • maxIdle:最大空闲连接数;
  • minIdle:最小空闲连接数;
  • blockWhenExhausted:表示当pool中的jedis实例都被分配完时,是否要进行阻塞;
  • maxWaitMillis:当blockWhenExhausted为true时,最大的阻塞时长。

    空闲连接资源检测相关:

  • testOnCreate:在创建Jedis实例时,测试连接可用性,默认关闭,如果打开,则保证创建的都是连接可用的Jedis实例;
  • testOnBorrow:在资源池借出Jedis实例时,测试连接可用性,默认关闭,如果打开,则保证借出的都是可用的;
  • testOnReturn:在Jedis归还Jedis资源池时,测试连接可用性,默认关闭;
  • testWhileIdle:表示有一个idle object evitor线程对空闲的Jedis实例进行扫描,如果验证失败,此Jedis实例会被从资源池中删除掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。

    空闲连接资源驱逐相关:

  • timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数;
  • numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数;
  • minEvictableIdleTimeMillis:空闲驱逐时间,表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义;
  • softMinEvictableIdleTimeMillis:软空闲驱逐时间,在minEvictableIdleTimeMillis基础上,还需要检测至少minIdle个对象已经在资源池里,才会进行驱逐;
  • lifo:当借出的资源时,是使用LIFO(last in first out)策略,借出最新使用的资源;还是使用FIFO策略,借出最久没有使用的资源。默认为true,即LIFO;
  • evictionPolicy:驱逐策略,接口,默认实现逻辑:资源的空闲毫秒数,如果大于空闲驱逐时间minEvictableIdleTimeMillis,或大于softMinEvictableIdleTimeMillis且当前的空闲资源数量大于配置的最小空闲资源数量,则进行驱逐

    BaseGenericObjectPool的配置如下:

    private volatile int maxTotal =
            GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL;
    private volatile boolean blockWhenExhausted =
            BaseObjectPoolConfig.DEFAULT_BLOCK_WHEN_EXHAUSTED;
    private volatile long maxWaitMillis =
            BaseObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;
    private volatile boolean lifo = BaseObjectPoolConfig.DEFAULT_LIFO;
    private final boolean fairness;
    private volatile boolean testOnCreate =
            BaseObjectPoolConfig.DEFAULT_TEST_ON_CREATE;
    private volatile boolean testOnBorrow =
            BaseObjectPoolConfig.DEFAULT_TEST_ON_BORROW;
    private volatile boolean testOnReturn =
            BaseObjectPoolConfig.DEFAULT_TEST_ON_RETURN;
    private volatile boolean testWhileIdle =
            BaseObjectPoolConfig.DEFAULT_TEST_WHILE_IDLE;
    private volatile long timeBetweenEvictionRunsMillis =
            BaseObjectPoolConfig.DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
    private volatile int numTestsPerEvictionRun =
            BaseObjectPoolConfig.DEFAULT_NUM_TESTS_PER_EVICTION_RUN;
    private volatile long minEvictableIdleTimeMillis =
            BaseObjectPoolConfig.DEFAULT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
    private volatile long softMinEvictableIdleTimeMillis =
            BaseObjectPoolConfig.DEFAULT_SOFT_MIN_EVICTABLE_IDLE_TIME_MILLIS;
    private volatile EvictionPolicy<T> evictionPolicy;
    private volatile long evictorShutdownTimeoutMillis =
            BaseObjectPoolConfig.DEFAULT_EVICTOR_SHUTDOWN_TIMEOUT_MILLIS;

    GenericObjectPool的配置如下:

    /**
     * The default value for the {@code maxTotal} configuration attribute.
     * @see GenericObjectPool#getMaxTotal()
     */
    public static final int DEFAULT_MAX_TOTAL = 8;

    /**
     * The default value for the {@code maxIdle} configuration attribute.
     * @see GenericObjectPool#getMaxIdle()
     */
    public static final int DEFAULT_MAX_IDLE = 8;

    /**
     * The default value for the {@code minIdle} configuration attribute.
     * @see GenericObjectPool#getMinIdle()
     */
    public static final int DEFAULT_MIN_IDLE = 0;


    private int maxTotal = DEFAULT_MAX_TOTAL;

    private int maxIdle = DEFAULT_MAX_IDLE;

    private int minIdle = DEFAULT_MIN_IDLE;

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197083.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2018美赛 A 题

    2018美赛 A 题2018年MCM问题A:多跳HF无线电传播背景:在高频(HF,定义为3-30mHz),无线电波可以通过离开电离层和离开地球的多次反射而行进很长距离(从地球表面上的一个点到地球表面上的另一个远点)。对于低于最大可用频率(MUF)的频率,来自地面源的HF无线电波将电离层反射回地球,在那里它们可能再次反射回到电离层,在那里它们可能再次反射回地球,等等,随着每个连续的…

    2022年6月5日
    37
  • 树莓派运行python命令_《树莓派Python编程入门与实战》——2.2 使用Raspbian命令行…[通俗易懂]

    本节书摘来异步社区《树莓派Python编程入门与实战》一书中的第2章,第2.2节,作者:【美】RichardBlum,更多章节内容可以访问云栖社区“异步社区”公众号查看2.2 使用Raspbian命令行树莓派Python编程入门与实战树莓派第一次启动的时候,没有要求你提供用户名和密码。然而,在初始化启动之后的所有后续启动中,你都会看到Raspbian的登录屏幕。清单2.1显示了如何登录树莓派。默…

    2022年4月12日
    42
  • SQL Server 2008还原数据库时出现“备份集中的数据库备份与现有的数据库不同”的解决方法

    SQL Server 2008还原数据库时出现“备份集中的数据库备份与现有的数据库不同”的解决方法引言 nbsp nbsp nbsp nbsp 现在在做项目 由于每个人是分模块的 所以大家的测试数据都不同步 导致好多时候会因为别人填的数据不同而调半天的错 所以我还是自己还原一个数据库 自己填自己的数据吧 nbsp nbsp 报错 nbsp nbsp nbsp nbsp nbsp 之前还原过很多个数据库都没什么问题 这次也是按照之前的步骤 先建立了一个目标数据库 之后选择源文件进行还原 最后报了这么一个错 解决方法 nbsp 1 nbsp 首先我们

    2025年6月20日
    1
  • 数据库系列之TiDB存储引擎TiKV实现机制

    数据库系列之TiDB存储引擎TiKV实现机制TiDB存储引擎TiKV是基于RocksDB存储引擎,通过Raft分布式算法保证数据一致性。本文详细介绍了TiKV存储引擎的实现机制和原理,加深对TiDB底层存储架构的理解。

    2022年9月23日
    4
  • android 触屏事件总结

    android 触屏事件总结如果view的down事件返回true,则接下去的move,up,cancel,事件最多传递到这个view,不会传递给view的子view如果所有的view的down事件都返回false,则后续的move,up,cancel,事件都不会传递给所有的view。所以,可以总结,就是down事件决定了触屏事件传递链的最后一个view如果viewX的down事件返回

    2022年9月11日
    2
  • hdu 3980 Paint Chain(SG函数)

    hdu 3980 Paint Chain(SG函数)PaintChainProblemDescriptionAekdycoinandabcdxyzkareplayingagame.Theygetacirclechainwithsomebeads.Initiallynoneofthebeadsispainted.Theytaketurnstopaintthechain.InEachtur

    2022年7月23日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号