上一期我们讲了Redis的几种常见客户端,今天呢我会跟大家聊一下如何通过Jedis将Redis应用到我们的JAVA项目中(SpringBoot对Redis有专门的封装,封装了Jedis和Lettuce,关于SpringBoot项目中如何更加简单的使用Redis我会在讲完三个客户端之后专门进行介绍,有兴趣的话可以点击专栏查看)。
源码地址:https://gitee.com/victory336/Redis-Jedis.git
省流小助手:项目中Redis如果用得少,可以使用第一种方式;如果用的多建议使用方式二的进阶版
一.方式一:
1.导包
这里如果是Maven项目可以直接去Maven仓库下,也可以将之前我们下好的Jedis打成Jar包直接引入
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.代码
/**
* 方式一:最朴素的操作方式
* 1.创建连接
* 2.操作redis
* 3.释放链接
**/
@Test
public void testJedis(){
//1.先创建一个连接
Jedis jedisConnection = new Jedis("127.0.0.1",6379,3000);
//2.然后操作redis
jedisConnection.set("user", "victory");
String user = jedisConnection.get("user");
//3.操作完成后关闭连接
if(jedisConnection != null){
jedisConnection.close();
}
}
3.测试
这里我们运行测试就可以看到输出的user对象为string类型的 "victory" ,再去我们的指令行里看
就可以看到,多了一个叫"user"的key,值为"victory"到这里说明我们操作成功了。
可是我们每次操作Redis时都需要创建连接,用完之后再释放连接。这样频繁创建销毁连接的性能开销是很大的,那么我们能不能参考JDBC的连接池呢。
二.方式二:
1.导包
同方式一
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.代码
/**
* 方式二:连接池进阶版(未抽取连接池工具)
* 1.创建连接池配置对象
* 2.配置连接池参数,拿到连接池配置对象
* 3.通过连接池配置对象将参数传入,拿到连接池
* 4.通过连接池拿到连接
* 5.操作Redis
* 6.释放链接
* 7.摧毁连接池(连接池生命周期一般与我们项目一样,即项目启东市创建连接池,项目结束时摧毁连接池)
**/
@Test
public void testJedisPool(){
//1.创建连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
//2.配置连接池参数
//2.1忙时最大连接(最大连接数)
config.setMaxTotal(8);//连接池的最大连接数。使用负数表示无极限。
//2.2闲时最大连接(最小连接数)
config.setMaxIdle(2);//连接池的最大空闲连接数。如果值很小的话会频繁的创建销毁连接导致性能开销增加。
//2.*闲时最小连接数
config.setMinIdle(0);//连接池的最小空闲连接数。确保池满足要求在空闲对象回收运行期间的最小实例数。minIdle配置值大于配置值对于maxIdle,则将使用maxIdle的值。
//2.3超时时间
config.setMaxWaitMillis(3000);
//2.4获取连接池检查时机
config.setTestOnBorrow(true);
//3.通过连接池配置对象,设置参数
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 3000);
//4.通过连接池获取连接
Jedis jedisConnection = jedisPool.getResource();
//5.执行操作
jedisConnection.set("user", "victory");
//6.释放连接
jedisConnection.close();
//7.摧毁连接池
jedisPool.destroy();
}
3.测试
到此,池化算是暂时完成了,但是好像看起来我们写的代码更多了呢
此时可以抽取一个连接池工具类,用的时候再去池里拿,用完再还回去。这样如果我们频繁操作Redis时可以明显少些很多重复代码,最重要的是减少不少性能开销。
三.方式二进阶版:
1.导包
同方式一
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.工具类准备
抽取一个JedisPoolUtils工具类
package cn.victory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @Description jedisUtils演示Demo
* @Author victory
* @Date 2022/5/25
**/
public enum JedisPoolUtils {
INSTANCE;
private static JedisPool jedisPool = null;
static {
//1.创建连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
//2.配置连接池参数
//2.1忙时最大连接(最大连接数)
config.setMaxTotal(8);//连接池的最大连接数。使用负数表示无极限。
//2.2闲时最大连接(最小连接数)
config.setMaxIdle(2);//连接池的最大空闲连接数。如果值很小的话会频繁的创建销毁连接导致性能开销增加。
//2.*闲时最小连接数
config.setMinIdle(0);//连接池的最小空闲连接数。确保池满足要求在空闲对象回收运行期间的最小实例数。minIdle配置值大于配置值对于maxIdle,则将使用maxIdle的值。
//2.3超时时间
config.setMaxWaitMillis(3000);
//2.4获取连接池检查时机
config.setTestOnBorrow(true);
//3.通过连接池配置对象,设置参数
jedisPool = new JedisPool(config, "127.0.0.1", 6379, 3000);
}
/**
* 获取连接
**/
public Jedis getConnection(){
if (jedisPool != null) {
return jedisPool.getResource();
}else {
return null;
}
}
/**
* 关闭连接
**/
public static void close(Jedis jedisConnection){
if(jedisConnection!=null){
jedisConnection.close();
}
}
}
这里的INSTANCE我简单随口一说,如果已经知道的朋友就当复习一下。因为连接池这个东西它的生命周期一般是我们项目启动到项目结束且全程只需要一个,所以在项目启动的时候我们把它放在方法区(也叫静态区)中,来保证他的唯一,而且可以跨栈使用。
然后就是工具类,当然工具类里可以写其他各种各样的方法,这里只做抛砖引玉和快速落实到项目中的作用,所以只写了获取连接的方法。后边空了再回来补充。
3.代码
/**
* 1.通过连接池拿到连接
* 2.操作Redis
* 3.释放连接
**/
@Test
public void testJedisPoolUtils(){
//实例化拿到连接
Jedis jedisConnection= JedisPoolUtils.INSTANCE.getConnection();
//操作Redis
jedisConnection.set("user", "victory");
//关闭连接
jedisConnection.close();
}
4.测试
今天就先到这里吧,下面几期会分别介绍剩下的两种之前提到过的框架,还有遥遥无期的集群和相关的高频知识点。祝各位儿童节快乐,永远年轻,三十五岁也不焦虑。还望各位看官点个赞再走吧,给您劈个叉~