【Java 进阶篇】深入浅出 Jedis 连接池与工具类

在这里插入图片描述

在现代的软件开发中,高效地与数据存储系统进行交互是至关重要的。而对于 Redis 这样的高性能键值存储系统,连接池成为了一个不可或缺的工具。本文将围绕 Jedis 连接池及其工具类展开详细解说,让我们一起揭开连接池的神秘面纱。

走进 Redis 与 Jedis

Redis,一个强大的内存数据库,以其高性能、支持丰富数据结构和灵活应用而受到开发者的喜爱。而 Jedis,是 Redis 的 Java 客户端,为 Java 开发者提供了便捷的操作接口。

在开始之前,请确保你的项目中已引入 Jedis 依赖。你可以在 Maven 项目的 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.7.0</version>
</dependency>

好了,让我们开始探讨 Jedis 连接池的奇妙之旅吧!

什么是连接池?

在传统的数据库交互中,每次需要与数据库建立连接时都会进行网络通信,这是一个相对昂贵的过程。连接池的出现就是为了解决这个问题。连接池通过在应用程序启动时创建一些连接并将它们保存在池中,当需要与数据库进行通信时,应用程序就可以从连接池中获取一个连接,而不是每次都重新创建连接。

这样做有很多好处,比如减少连接创建和销毁的开销、提高性能、防止连接泄漏等。而 Jedis 连接池则是为了更好地与 Redis 服务器进行通信而设计的。

Jedis 连接池的基本使用

1. 创建 Jedis 连接池

在 Jedis 中,通过 JedisPool 类来创建连接池。以下是一个简单的例子:

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

public class JedisPoolExample {

    public static void main(String[] args) {
        // 配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(10); // 设置最大连接数
        poolConfig.setMaxIdle(5);   // 设置最大空闲连接数

        // 创建 Jedis 连接池
        JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);

        // 从连接池中获取 Jedis 实例
        try (Jedis jedis = jedisPool.getResource()) {
            // 进行 Redis 操作
            jedis.set("key", "value");
            System.out.println("获取到的值: " + jedis.get("key"));
        }

        // 关闭连接池
        jedisPool.close();
    }
}

在这个例子中,我们首先配置了连接池的一些参数,比如最大连接数和最大空闲连接数。然后,通过 JedisPool 构造方法传入配置和 Redis 服务器的地址及端口,就创建了一个 Jedis 连接池。最后,通过 getResource() 方法从连接池中获取一个 Jedis 实例,进行 Redis 操作。

2. 连接池的关闭

在使用完连接池后,我们需要调用 close() 方法来关闭连接池,释放资源。在实际应用中,你可以考虑在应用程序关闭时执行这个操作。

jedisPool.close();

Jedis 连接池的工具类

为了更方便地使用 Jedis 连接池,我们可以创建一个工具类来管理连接池的初始化和销毁。以下是一个简单的示例:

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

public class JedisPoolUtils {

    private static JedisPool jedisPool;

    // 初始化连接池
    static {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(10);
        poolConfig.setMaxIdle(5);

        jedisPool = new JedisPool(poolConfig, "localhost", 6379);
    }

    // 获取 Jedis 实例
    public static JedisPool getJedisPool() {
        return jedisPool;
    }

    // 关闭连接池
    public static void closeJedisPool() {
        if (jedisPool != null) {
            jedisPool.close();
        }
    }
}

在这个工具类中,我们使用了静态块来初始化连接池,保证在类加载时就创建连接池实例。然后,通过两个静态方法 getJedisPool()closeJedisPool() 分别获取连接池实例和关闭连接池。

这样,我们在应用程序中就可以更方便地管理连接池,而不用每次都重复配置和创建。

Jedis 连接池的异常处理

在实际应用中,我们需要考虑到连接池可能会出现异常的情况。Jedis 提供了一些异常类,比如 JedisConnectionExceptionJedisDataException。在使用连接池时,我们需要适当地捕获这些异常并进行处理。

以下是一个简单的异常处理示例:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisConnectionException;

public class JedisPoolExceptionHandling {

    public static void main(String[] args) {
        try {
            // 获取 Jedis 实例
            Jedis jedis = JedisPoolUtils.getJedisPool().getResource();

            // 进行 Redis 操作
            jedis.set("key", "value");
            System.out.println("获取到的值: " + jedis.get("key"));

            // 关闭 Jedis 实例
            jedis.close();
        } catch (JedisConnectionException e) {
            // 处理连接异常
            System.err.println("连接异常:" + e.getMessage());
        } finally {            // 在 finally 块中释放资源,确保资源得到释放
            if (jedis != null) {
                try {
                    jedis.close();
                } catch (Exception e) {
                    // 如果在关闭连接时发生异常,可以记录日志或其他处理
                    System.err.println("关闭连接异常:" + e.getMessage());
                }
            }

            // 在 finally 块中关闭连接池,确保应用程序结束时资源得到释放
            JedisPoolUtils.closeJedisPool();
        }
    }
}

在异常处理的示例中,我们使用了 try-catch 块来捕获可能发生的连接异常。在实际开发中,你可能会根据具体情况处理更多类型的异常。

连接池的性能优化

Jedis 连接池本身已经是一个性能优化的工具,但我们仍然可以通过一些配置和注意事项来进一步提升性能。

1. 连接超时设置

在连接池的配置中,你可以设置连接的超时时间,即 jedisPoolConfig.setConnectionTimeout()。这个时间是指获取连接时,如果没有可用连接,最大等待时间。合理设置这个时间可以防止请求线程长时间阻塞。

poolConfig.setConnectionTimeout(2000); // 设置连接超时为 2 秒

2. Socket 超时设置

除了连接超时,我们还可以设置 Socket 超时,即 jedisPoolConfig.setSoTimeout()。这个时间是指从连接池获取连接后,执行 Redis 命令的最大等待时间。

poolConfig.setSoTimeout(1000); // 设置 Socket 超时为 1 秒

3. 测试连接可用性

在默认情况下,连接池会自动检测连接的可用性。你可以通过设置 jedisPoolConfig.setTestOnBorrow(true) 来启用连接可用性检测。

poolConfig.setTestOnBorrow(true); // 启用连接可用性检测

4. 连接池的回收

连接池不仅需要创建连接,还需要及时回收不再使用的连接。你可以通过设置 jedisPoolConfig.setTestWhileIdle(true) 来启用空闲连接的检测。

poolConfig.setTestWhileIdle(true); // 启用空闲连接检测

5. 其他配置

除了上述几点,连接池还有其他一些配置,比如最大等待时间、最小空闲连接数等。根据具体需求,适度调整这些配置可以进一步优化连接池的性能。

总结

通过本文的学习,你应该对 Jedis 连接池及其工具类有了更清晰的认识。连接池的引入不仅可以提高与 Redis 服务器的通信效率,还能有效地管理连接资源,防止出现连接泄漏等问题。

在实际开发中,理解连接池的原理以及合理地配置连接池参数对于系统的性能和稳定性至关重要。希望你能够通过这篇文章更加深入地了解 Jedis 连接池,并在实际项目中灵活运用这些知识。

Happy coding!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/279189.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

m3u8网络视频文件下载方法

在windows下&#xff0c;使用命令行cmd的命令下载m3u8视频文件并保存为mp4文件。 1.下载ffmpeg&#xff0c;访问FFmpeg官方网站&#xff1a;https://www.ffmpeg.org/进行下载 ffmpeg下载&#xff0c;安装&#xff0c;操作说明 https://blog.csdn.net/m0_53157282/article/det…

鸿蒙OS应用开发之气泡提示

前面学习了弹窗提示,其实有时候只是想在旁边做一些说明,那么采用弹窗的方式就比较麻烦一些,这时可以采用系统里面的气泡提示方式。 系统也提供了几种方式弹出气泡提示,最简单的一种是采用bindPopup属性。它的定义如下: 在后面的参数设置里,也是比较复杂的形式。我们先来演…

【滑动窗口】【差分数组】C++算法:K 连续位的最小翻转次数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 差分数组 LeetCode995: K 连续位的最小翻转次数 给定一个二进制数组 nums 和一个整数 k 。 k位翻转 就是从 nums 中选择一个长度为 k 的 子数组 &#xff0c;同时把子数组中…

Halcon颜色通道的处理decompose3/image_to_channels/channels _to _image

Halcon颜色通道的处理 文章目录 Halcon颜色通道的处理一. 图像的通道二. 访问通道1.访问通道2.获取通道的数量 三. 通道分离与合并1. decompose3算子2. image_to_channels 算子3. compose3算子4. channels_to_image算子 四. 处理RGB信息 由于彩色图像通常包含不止一个通道&…

@Zabbix监控网络设备Trap接口UPDOWN关联告警配置

网络设备Trap接口UPDOWN关联告警配置 文章目录 网络设备Trap接口UPDOWN关联告警配置SNMPTrap描述1.监控平台监控项配置2.监控平台日志接收3.监控平台触发器配置4.监控平台触发器功能测试1&#xff09;告警触发2&#xff09;告警恢复 5.告警解析 SNMPTrap描述 在Zabbix中&#x…

网络基础操作练习

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 手把手教你操作华为设备&#xff0c;新手必看。 实验拓扑图 关于命令行视图 1&#xff09;用户视图 <Huawei> 2&#xff09;系统视图 [Hu…

超维空间S2无人机使用说明书——51、基础版——使用yolov8进行目标跟踪

引言&#xff1a;为了提高yolo识别的质量&#xff0c;提高了yolo的版本&#xff0c;改用yolov8进行物体识别&#xff0c;同时系统兼容了低版本的yolo&#xff0c;包括基于C的yolov3和yolov4&#xff0c;以及yolov7。 简介&#xff0c;为了提高识别速度&#xff0c;系统采用了G…

添加 Android App Links

添加 Android App Links功能 介绍一个简单的效果Android配置Add Url intent filtersAdd logic to handle the intentAssociate website 搭建网页支持AppLinks 介绍 Android App Links 是指将用户直接转到 Android 应用内特定内容的 HTTP 网址。Android App Links 可为您的应用带…

大数据学习(30)-Spark Shuffle

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

re:Invent 2023技术上新|Amazon DynamoDB与OpenSearch Service的Zero-ETL集成

Amazon DynamoDB 与 Amazon OpenSearch Service 的 Zero-ETL 集成已正式上线&#xff0c;该服务允许您通过自动复制和转换您的 DynamoDB 数据来搜索数据&#xff0c;而无需自定义代码或基础设施。这种 Zero-ETL 集成减少了运营负担和成本&#xff0c;使您能够专注于应用程序。这…

用通俗易懂的方式讲解大模型:基于 Langchain 和 ChatChat 部署本地知识库问答系统

之前写了一篇文章介绍基于 LangChain 和 ChatGLM 打造自有知识库问答系统&#xff0c;最近该项目更新了0.2新版本&#xff0c;这个版本与之前的版本差别很大&#xff0c;底层的架构发生了很大的变化。 该项目最早是基于 ChatGLM 这个 LLM&#xff08;大语言模型&#xff09;来…

【SAP-FICO】--总账标识配置路径OBXR

FICO业务需求&#xff1a; F-02&#xff0c;财务会计凭证填写09客户A时&#xff0c;带出的总账标识为可编辑。 需求截图&#xff1a; 第一步&#xff1a;了解需求 首先&#xff0c;我们要明白&#xff0c;财务凭证生成&#xff0c;是分多种类型&#xff08;不同类型的凭证&a…

HarmonyOS自学-Day4(TodoList案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;TodoList小案例 文章声明⭐⭐⭐ 该文章为我&#xff08;有编程语言基础&#xff0c;非编程小白&#xff09;的 HarmonyOS自学笔记&#xff0c;此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…

ES6+ 面试常问题

一、let const var 的区别 1. var&#xff1a; 没有块级作用域的概念&#xff0c;有函数作用域和全局作用域的概念全局作用域性下创建变量会被挂在到 windows 上存在变量提升同一作用域下&#xff0c;可以重复赋值创建未初始化&#xff0c;值为 undefined 2. let&#xff1a…

相机删除视频恢复后损坏打不开修复方法

同事对热恋5年的女朋友精心准备了一场浪漫求婚仪式&#xff0c;让朋友帮忙用单反相机拍摄记录这一美好时刻。不巧的的是朋友清理相机空间时&#xff0c;不小心把这一视频删除了&#xff0c;找人帮忙把视频恢复了&#xff0c;却无奈发现恢复出来的视频播放不了&#xff0c;真是好…

【第4期】Springboot集成阿里云对象存储OSS+Vue+Iview文件上传组件

本期简介 文件上传是非常常见的功能&#xff0c;本期要实现的功能是将文件存储到阿里云分布式对象存储OSS中&#xff0c;这样做的好处是随便哪里都可以方便的展示出该图片&#xff0c;并且图片以链接形式在客户端浏览器渲染&#xff0c;流量不会经过后台&#xff0c;降低后台压…

【23.12.29期--Spring篇】Spring的 IOC 介绍

介绍一下Spring的IOC ✔️引言✔️ lOC的优点✔️Spring的IOC✔️ 拓展知识仓✔️IOC是如何实现的&#xff1f; ✔️引言 所谓的IOC (inversion of control) &#xff0c;就是控制反转的意思。何为控制反转? 在传统的程序设计中&#xff0c;应用程序代码通常控制着对象的创建和…

Pycharm 切换interpreter---python的环境和第三方库问题

这篇回答两个问题&#xff1a; 1.为什么在 pycharm中打开新的project&#xff0c;切换interpreter 之后发现自己之前装的库消失了&#xff1f; 2.为什么 interpreter 切换到python3.8了&#xff0c; terminal 还是在 3.9&#xff1f;&#xff1f; 问题的关键&#xff1a;搞懂什…

STM32CubeMX学习(二) USB CDC 双向通信

STM32CubeMX学习&#xff08;二&#xff09; USB CDC 双向通信 简介CubeMX新建工程&#xff08;串口LED&#xff09;测试串口和LED串口接收测试USB CDC通信 简介 利用正点原子F407探索者开发板&#xff0c;测试基于USB CDC的双向数据通信。 CubeMX新建工程&#xff08;串口LE…

工业企业出口技术复杂度测算(2000-2014年)

工业企业出口技术复杂度的测算是对工业企业出口产品的技术含量和复杂度进行评估的过程。这种测算通常涉及分析出口产品的研发强度、生产过程的复杂性、所需的技术知识水平以及产品在全球市场上的竞争力。技术复杂度高的产品可能包括高端制造业产品&#xff0c;如先进电子设备、…