目录
一、基本配置
1.1 引入依赖
1.2 建立连接
1.3 测试String类型
1.4 释放资源
1.5 运行结果
二、Jedis连接池
Jedis的官方地址:GitHub - redis/jedis: Redis Java client designed for performance and ease of use.
Jedis单词就是Java和Redis的组合单词
Jedis小小的弊端就是线程不安全的,多线程并发的时候是有线程安全问题的
但是不用担心,Spring擅长整合,后面会学SpringDataRedis,其会解决这些问题,底层兼容Jedis、lettuce
redis.clients
jedis
如果我们没有密码的话,我们就把第二条注释掉就可以了,否则就会报错
ERR Client sent AUTH, but no password is set
private Jedis jedis;
@BeforeEach//测试类中任何一个测试方法执行之前都先执行该注解标注的方法
void contextLoads() {
// 1.建立连接
jedis = new Jedis("127.0.0.1",6379);
// 2.设置密码
jedis.auth("root");
// 3.选择库 如果我们不选择的话,默认就是选择的0号库
jedis.select(0);
}
@Test
void testString(){
// 存入数据
String result = jedis.set("name","张靖奇");
System.out.println("result:"+result);
// 获取数据
String name = jedis.get("name");
System.out.println("name:"+name);
}
@AfterEach
void tearDown(){
// 我们这里应该判断一下,防止出现空指针异常
if(jedis !=null){
jedis.close();
}
}
@Test
void testHash(){
// 存放Hash数据
jedis.hset("user:1","name","jack");
jedis.hset("user:1","age","21");
// 取数据
Map map = jedis.hgetAll("user:1");
System.out.println(map);
}
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能的损耗,因此推荐使用Jedis连接池代替Jedis的直连方式
public class JedisConnectionFactory {
private static final JedisPool jedisPool ;
static {
// 1.配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 1.1配置最大连接数 最多配置8个连接
poolConfig.setMaxTotal(8);
// 1.2 配置最大空闲连接 代表就算没有人访问这个池子,但我也会最多预备8个连接,这样的话一旦有人来了就可以直接使用不用临时创建
poolConfig.setMaxIdle(8);
// 1.3 最小空闲连接 代表着如果长时间没有访问这个池子,那我们的池子就会释放,一直释放到0为止
poolConfig.setMinIdle(0);
// 1.4 等待时长 代表当连接池里没有连接可以使用的时候,我们要不要等待,等待多长时间,默认是-1也就是没有时间限制一直等待到有空闲连接为止
// 我们这里配置一个最多等待1000毫秒
poolConfig.setMaxWaitMillis(1000);
// 创建连接池对象 (如果有密码的话,可以在参数列表后面加上密码 这里的1000是超时时间
jedisPool = new JedisPool(poolConfig,"127.0.0.1",6379,1000);
}
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
然后我们再改一下我们的建立连接池
@BeforeEach//测试类中任何一个测试方法执行之前都先执行该注解标注的方法
void contextLoads() {
// 1.建立连接
// jedis = new Jedis("127.0.0.1",6379);
jedis = JedisConnectionFactory.getJedis();
// 2.设置密码
// jedis.auth("123321");
// 3.选择库 如果我们不选择的话,默认就是选择的0号库
jedis.select(0);
}
到现在的小伙伴可能在想,那我们最后执行close方法的时候,不还是销毁了吗?
答案:不是销毁了
我们看一下close的原码文件,当判断我们有连接池的时候就是进入到第一个if,底层并不会真正的close,而是归还return出去了
pool.returnBrokenResource(this); 或者是
pool.returnResource(this);