当前位置: 首页 > news >正文

【Redis】Jedis与Jedis连接池

目录

1. Jedis 单实例连接

2. Jedis 连接池(JedisPool)

3. JedisPool 与 Jedis 的区别

4. JedisPool 线程安全

6. 使用 JedisPool 的注意事项


1. Jedis 单实例连接

在最简单的用法中,Jedis 提供了直接与 Redis 服务器连接的方式。这适合于单线程应用或者当你不需要频繁地进行 Redis 操作时。

示例代码:

package com.heima.test;
import com.heima.jedis.util.JedisConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.Map;public class JedisTest {private Jedis jedis;@Beforepublic void setUp() throws Exception {//1.建立连接jedis = new Jedis("192.168.30.134",6379);//2.设置密码jedis.auth("123321");//3.选择库jedis.select(0);}@Testpublic void testString() {//存入数据String result = jedis.set("name","虎哥");System.out.println("result = "+result);//获取数据String name = jedis.get("name");System.out.println("name = "+name);}@Testpublic void testHash() {//插入hash数据jedis.hset("user:1","name","Jack");jedis.hset("user:1","age","21");//获取数据Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}@Afterpublic void tearDown() throws Exception {if(jedis != null){jedis.close();}}
}

存在问题:

  • 性能问题:每次操作 Redis 都会建立和销毁连接,导致性能开销较大。
  • 线程安全问题:在多线程环境中,如果每个线程都创建一个 Jedis 实例,它们会共享底层的连接资源,可能会导致并发问题。

2. Jedis 连接池(JedisPool

为了提高性能并解决连接管理的问题,Jedis 提供了 连接池JedisPool 用于管理 Redis 连接,并允许多个线程共享连接,而无需每次都创建新的连接。Jedis 连接池通常在高并发环境下使用。

使用 JedisPool 的好处:

  • 连接复用:JedisPool 允许你从池中获取连接并在操作完成后返回池中,而不需要每次都建立新连接。
  • 性能提升:通过复用连接,避免了频繁创建和销毁连接的开销。
  • 线程安全:连接池本身是线程安全的,可以在多个线程之间共享连接。

示例代码:

package com.heima.jedis.util;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisPool;public class JedisConnectionFactory {private static final JedisPool jedisPool;static {//配置连接池JedisPoolConfig poolConfig = new JedisPoolConfig();//设置最大连接数poolConfig.setMaxTotal(8);//设置最大空闲连接数poolConfig.setMaxIdle(8);//设置最小空闲连接数poolConfig.setMinIdle(0);//设置最长等待时间,mspoolConfig.setMaxWaitMillis(1000);//创建连接池对象jedisPool = new JedisPool(poolConfig,"192.168.30.134",6379,1000,"123321");}public static Jedis getJedis(){return jedisPool.getResource();}
}
package com.heima.test;
import com.heima.jedis.util.JedisConnectionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;import java.util.Map;public class JedisTest {private Jedis jedis;@Beforepublic void setUp() throws Exception {//1.建立连接
//        jedis = new Jedis("192.168.30.134",6379);jedis = JedisConnectionFactory.getJedis();//2.设置密码jedis.auth("123321");//3.选择库jedis.select(0);}@Testpublic void testString() {//存入数据String result = jedis.set("name","虎哥");System.out.println("result = "+result);//获取数据String name = jedis.get("name");System.out.println("name = "+name);}@Testpublic void testHash() {//插入hash数据jedis.hset("user:1","name","Jack");jedis.hset("user:1","age","21");//获取数据Map<String, String> map = jedis.hgetAll("user:1");System.out.println(map);}@Afterpublic void tearDown() throws Exception {if(jedis != null){jedis.close();}}
}

3. JedisPool 与 Jedis 的区别

  • Jedis:单个 Redis 连接,通常适用于简单或低并发的场景。每次操作 Redis 都需要建立一个新的连接,开销较大,尤其是在高并发环境中。
  • JedisPool:一个 Redis 连接池,适用于高并发场景。连接池中的连接可以被多个线程共享,减少了连接的创建和销毁的开销,同时连接池可以有效管理连接资源。

4. JedisPool 线程安全

  • 线程安全JedisPool 本身是线程安全的,这意味着你可以在多个线程中共享同一个连接池。每个线程通过 getResource() 获取一个连接,操作完成后,使用 jedis.close() 将连接归还池中。
  • 连接复用:多个线程共享同一个连接池,避免了频繁创建和销毁连接的性能开销。

6. 使用 JedisPool 的注意事项

  • 连接池的大小:连接池的大小应根据系统负载和 Redis 服务器的并发处理能力进行调整。可以通过配置 setMaxTotal 来控制连接池的大小。
  • 关闭连接池:在应用程序关闭时,要调用 jedisPool.close() 来释放资源,避免内存泄漏。
  • 性能调优:合理配置连接池的空闲连接数、最大连接数、最大等待时间等参数,以适应具体的业务需求。
http://www.xdnf.cn/news/65395.html

相关文章:

  • Oracle数据库和PLSQL安装配置
  • 基于单片机的BMS热管理功能设计
  • 实验四 Java图形界面与事件处理
  • 如何对只能有一个`public`顶层类这句话的理解
  • 【解决】Vue + Vite + TS 配置路径别名成功仍爆红
  • Unreal Engine中FRotator与FQuat在赛车游戏方向盘控制中的协同应用解析
  • 【C++编程入门】:从零开始掌握基础语法
  • CENTOS 7 安装VNC
  • 【Java面试笔记:基础】1.谈谈你对Java平台的理解?
  • 移动端动态滑动拨盘选择器【Axure元件库】
  • 自注意力机制、多头自注意力机制、填充掩码 Python实现
  • 如何在白平衡标定种构建不同类型的白平衡色温坐标系
  • Android 音悦适配-v4.3.3-可在线播放可下载音乐的第三方APP
  • 【解决方法】关于解决QGC地面站4.4.3中文BUG,无法标注航点的问题
  • 模型检测技术的发展历史简介
  • Redis基础知识
  • 山东大学软件学院创新项目实训开发日志(21)之小问题修复之对话方向修改
  • 工厂模式:简单工厂模式
  • 免费送源码:ava+springboot+MySQL 基于springboot 宠物医院管理系统的设计与实现 计算机毕业设计原创定制
  • 修改IP地址能否精确到地级市的县?——全面解析
  • 第39讲|决策树与作物分布建模:可解释的AI助力农业智能推演
  • WINDOWS下使用命令行读取本地摄像头FFMPEG+DirectShow,ffplay直接播放摄像头数据
  • arkTs:使用Refresh实现下拉刷新功能(含状态提示与动画控制)
  • MySQL知识点讲解
  • n2n 搭建虚拟局域网,实现内网穿透
  • C++计算 n! 中末尾零的数量
  • RIP动态路由(三层交换机+单臂路由)
  • 20250421在荣品的PRO-RK3566开发板的Android13下频繁重启RKNPU fde40000.npu: Adding to iommu gr
  • Java学习路线--自用--带链接
  • win11修改文件后缀名