Redis Java 客户端 之 Jedis
Jedis is “Redis Client for Java”
Redis客户端官方文档:https://redis.io/docs/latest/develop/clients/
Jedis的官方网址:https://github.com/redis/jedis
文章目录
- Jedis is "Redis Client for Java"
- 一、快速入门
- 1.引入依赖
- 2.建立连接
- 3.测试String、Hash
- 4.释放资源
- 二、Jedis连接池
- 1.编写连接池配置
- 2.修改连接方式
- 3.归还连接(非关闭连接)
- 三、(可略过)提供SLF4J日志实现
- 1. 添加一个具体的日志实现依赖
- 2.移除冲突的日志实现
- 3.添加日志配置文件
- 4. 清理并重新构建项目
一、快速入门
优点:以Redis命令作为方法名称,学习成本低,简单实用。
缺点:Jedis实例是线程不安全的,多线程环境下需要基于链接池实用。
1.引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
2.建立连接
private Jedis jedis;
@BeforeEach
void setUp() {
// 1.建立连接
jedis = new Jedis("127.0.0.1", 16379);
// 2.设置密码
jedis.auth("123456");
// 3.选择库
jedis.select(0);
}
3.测试String、Hash
@Test
void testString() {
// 存入数据
String result = jedis.set("name", "查理布朗");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
@Test
void testHash() {
// 插入hash数据
jedis.hset("user:1", "name", "查理布朗");
jedis.hset("user:1", "age", "18");
// 取出hash数据
Map<String, String> map = jedis.hgetAll("user:1");
System.out.println("map = " + map);
}
4.释放资源
@AfterEach
void tearDown() {
// 释放资源
if (jedis != null) {
jedis.close();
}
}
二、Jedis连接池
Jedis本身是线程不安全的,并且频繁创建和销毁连接会有性能损耗,因此推荐 JedisPool 代替 Jedis 的直连方式。
1.编写连接池配置
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
// 1.配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8); // 最大连接数:最多允许创建8个连接
poolConfig.setMaxIdle(8); // 最大空闲连接数:最多允许8个空闲连接
poolConfig.setMinIdle(0); // 最小空闲连接数:如果一直没有连接,释放连接
poolConfig.setMaxWaitMillis(1000); // 最大等待时间(默认值为-1,一直等待):最多等待1000毫秒
// 2.创建连接池对象:ages={ 连接池配置, host, port, timeout, password, database }
jedisPool = new JedisPool(poolConfig, "127.0.0.1", 16379, 1000, "123456", 0);
}
public static Jedis getJedis() {
// 从连接池获取连接
return jedisPool.getResource();
}
}
2.修改连接方式
private Jedis jedis;
@BeforeEach
void setUp() {
// 建立连接
jedis = JedisConnectionFactory.getJedis();
}
3.归还连接(非关闭连接)
此处调用jedis.close()
方法,是归还资源,并非关闭连接
@AfterEach
void tearDown() {
if (jedis != null) {
// 归还连接 *[1]
jedis.close();
}
}
Jedis.class中的close()
方法源码解释:
public void close() {
// 当连接池非空
if (this.dataSource != null) {
JedisPoolAbstract pool = this.dataSource;
this.dataSource = null;
if (this.isBroken()) {
pool.returnBrokenResource(this);
} else {
// 归还连接
pool.returnResource(this);
}
} else {
// 关闭连接
super.close();
}
}
三、(可略过)提供SLF4J日志实现
这个警告信息表明 SLF4J(Simple Logging Facade for Java)在运行时无法找到 org.slf4j.impl.StaticLoggerBinder 类,因此它默认使用了无操作(NOP)的日志实现。这意味着日志信息将不会被输出到任何地方。
要解决这个问题,你需要为 SLF4J 提供一个具体的日志实现库。以下是解决步骤:
1. 添加一个具体的日志实现依赖
SLF4J 是一个日志门面,需要与具体的日志实现库配合使用。常见的日志实现包括 Logback、Log4j 2 和 java.util.logging (JUL)。推荐使用 Logback,因为它性能优越且与 SLF4J 集成良好。
使用 Logback(推荐)
在 pom.xml 中添加以下依赖:
<dependencies>
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<!-- Logback 经典实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!-- 其他依赖 -->
<!-- ... -->
</dependencies>
注意:logback-classic
已经包含了 slf4j-api
,因此无需重复添加 slf4j-api
,除非你有特殊需求。
2.移除冲突的日志实现
确保你的项目中 只 有一个 SLF4J 的实现。如果有多个实现存在,SLF4J 会无法确定使用哪一个,从而导致警告。
检查依赖树
使用以下命令查看项目的依赖树,以识别是否有多个 SLF4J 实现:
mvn dependency:tree
查找是否有多个如 logback-classic
、log4j-slf4j-impl
或 slf4j-jdk14
等依赖。如果发现多个,需要排除不需要的实现。
排除多余的依赖
假设你选择了 Logback,但项目中引入了 log4j-slf4j-impl
,可以在 pom.xml
中排除它。例如:
<dependency>
<groupId>某个组</groupId>
<artifactId>某个依赖</artifactId>
<version>版本号</version>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</exclusion>
</exclusions>
</dependency>
3.添加日志配置文件
根据你选择的日志实现,添加相应的配置文件。
使用 Logback
在 src/main/resources
目录下创建 logback.xml
文件,内容示例如下:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
4. 清理并重新构建项目
在完成上述步骤后,清理并重新构建你的 Maven 项目以确保所有更改生效:
mvn clean install