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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 安卓ExpandableListView的详细使用教程(附代码解析过程)

    安卓ExpandableListView的详细使用教程(附代码解析过程)ExpandableListView又称可扩展的ListView,它可以实现点击父项展开子项的效果,本文实现了一个比较精美的ExpandableListView。

    2022年6月30日
    17
  • LaTex学习笔记——LaTeX公式换行

    LaTex学习笔记——LaTeX公式换行ps.  1、“\!”表示其前后字符之间无间隙       2、暂留       3、段落中的数学表达式应该置于(和), $和$ 或者begin{math}和end{math} 之间。       4、对于较大的数学式子,最好的方法是使用显示式样来排版:将它们放置于[和]或begin{displaymath}和end{displaymath}之间。这样排版出的公式是没有编号…

    2022年6月7日
    161
  • 1024是程序员的什么节日(重阳节的时候干什么)

    1024程序员节1024程序员节是广大程序员的共同节日。1024是2的十次方,二进制计数的基本计量单位之一。针对程序员经常周末加班与工作日熬夜的情况,部分互联网机构倡议每年的10月24日为1024程序员节,在这一天建议程序员拒绝加班。程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界。1G=1024M,而1G与1级谐音,也有一级棒的意思。1、节日背景程序员(英文Programmer)是从事前端、后端程序开发、系统运维、测试等的专业人员。一般将程序员分为程序设计人员和程序.

    2022年4月12日
    58
  • 深度学习简介(一)——卷积神经网络「建议收藏」

    深度学习简介(一)——卷积神经网络「建议收藏」本文的主要目的,是简单介绍时下流行的深度学习算法的基础知识,本人也看过许多其他教程,感觉其中大部分讲的还是太过深奥,于是便有了写一篇科普文的想法。博主也是现学现卖,文中如有不当之处,请各位指出,共同进

    2022年8月3日
    8
  • 一般运维架构图「建议收藏」

    一般运维架构图「建议收藏」架构图:整体架构如架构图所示,client端请求通过域名解析访问到服务端负载均衡器slb或者nginx(静态内容存储在阿里云oss并通过cnd加速访问),然后经过安全组过滤,请求最终到达server端,经过业务处理并在阿里云数据库RDS读写数据后返回客户端…

    2022年7月17日
    36
  • WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】

    WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】目录1.前言2.出现的问题情况2.1找不到WIFI,连不了网。2.2网络适配器里没有WLAN选项3.解决方法(推荐按顺序进行)。1.先检查WLAN是否存在2.修改服务设置3.直接重启4.通过驱动软件修复电脑网络5.通过ccleaner修复注册表6.进入bios系统修改wireless设置7.重装系统(最好不要)8.博主问题的解决1.前言最近每天打开电脑时都会出现这样的情况,每次折腾半天,有时候运气好重启一下就…

    2022年7月11日
    45

发表回复

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

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