jedis线程不安全,需要配合连接池使用
- Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。
- Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map.Queue等,而且支持跨进程的同步机制:Lock.Semaphore等待,比较适合用来实现特殊的功能需求。
1.引入依赖
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>
2.打开链接
private Jedis jedis;
// 用于表示应在当前类中的每个@Test方法之前执行注解方法。
@BeforeEach
void setUp() {
// 1建立链接
jedis = new Jedis("127.0.0.1", 6379);
// 2设置密码
jedis.auth("redis");
// 3选择库
jedis.select(0);
}
3.操作redis,同命令行一样
@Test
public void test() {
jedis.hset("com:hxut:stu1", "age", "23");
jedis.hset("com:hxut:stu1", "name", "lisi2");
Map<String, String> map = jedis.hgetAll("com:hxut:stu1");
System.out.println(map);
}
4.关闭链接
@AfterEach
void shutConn() {
if (jedis != null) {
jedis.close();
}
}
jedis连接池
上面的情况不支持多线程,且经常修改创建链接,有损耗,就需要用到链接池
1.创建链接池,不需要额外添加依赖
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisConnectionFacotry {
//链接池对象
private static final JedisPool jedisPool;
static {
//配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8);//最大链接数,最大允许8个链接
poolConfig.setMaxIdle(8);//最大空闲链接, 当没有人用的时候创建8个链接
poolConfig.setMinIdle(0);//当过了一段时间,没人使用maxidle的链接,就释放一个,直到放到0
poolConfig.setMaxWaitMillis(1000);//当链接池里没有可用时,要不要等待,最多等待1000毫秒,
// 如果超过,还没有给链接,就报错
//创建连接池对象
jedisPool = new JedisPool(poolConfig,
"127.0.0.1", 6379, 1000, "redis");
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
2.使用连接池
package com;
import com.DataSource.JedisConnectionFacotry;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import java.util.Map;
public class heima {
private Jedis jedis;
// 用于表示应在当前类中的每个@Test方法之前执行注解方法。
@BeforeEach
void setUp() {
// 1建立链接
jedis = JedisConnectionFacotry.getJedis();
// 2设置密码
jedis.auth("redis");
// 3选择库
jedis.select(0);
}
@Test
public void test() {
jedis.hset("com:hxut:stu1", "age", "23");
jedis.hset("com:hxut:stu1", "name", "lisi2");
Map<String, String> map = jedis.hgetAll("com:hxut:stu1");
System.out.println(map);
}
@AfterEach
void shutConn() {
if (jedis != null) {
jedis.close();
}
}
}