Java客户端操作Redis
Java生态丰富,自定义的客户端非常多,常见的有Jedis、Lettuce、以及Spring整合后的RedisTemplate,但是对于初学者而言,从Jedis开始入门学习是非常容易上手的,因为Jedis中的API与原生Redis命令高度一致。
1. 引入Jedis依赖
此处引入如下依赖:
- Jedis:Java操作Redis客户端
- Junit:方便编写单元测试
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
2. 配置Xshell端口转发
- 操作步骤:1. 打开Xshell点击属性 => 2. 配置SSH隧道 => 3. 配置如下端口转发内容
- 打开windows cmd程序输入:
netstat -ano | findstr 8888
如果观察如下
- 确保
redis.conf
配置中设置protect-mode为no以及bind为0.0.0.0
3. 编写Demo
使用Jedis的步骤如下:
- 创建JedisPool连接池对象(配置redis服务器所在IP地址+端口号)
- 从JedisPool连接池中取出连接对象,并操作其中提供的API方法
- 解析响应内容
/**
* 测试Redis连通性
* @author 米饭好好吃
*/
@Test
public void testPing() {
// 1. 创建JedisPool
JedisPool pool = new JedisPool("tcp://127.0.0.1:8888");
// 2. 获取连接对象
try(Jedis jedis = pool.getResource();) {
// 设置密码(如果有)
jedis.auth("xxxxxx");
// 3. 调用API-ping
String pong = jedis.ping();
// 4. 解析响应结果
System.out.println(pong);
}
}
4. 测试通用命令
- 测试SET、GET命令:
:::success
注意:此处GET、SET命令是针对string类型的,此处测试通用命令需要借助SET、GET命令
:::
/**
* 测试通用命令
* @author 米饭好好吃
*/
public class TestCommon {
// redis连接池对象
private JedisPool pool;
@Before
public void init() {
pool = new JedisPool("tcp://127.0.0.1:6379");
}
/**
* 测试SET、GET命令
*/
@Test
public void testGETAndSET() {
// 1. 获取连接对象
try(Jedis jedis = pool.getResource();) {
// 2. 配置密码(如果有的话)
jedis.auth("xxxxxx");
// 3. 清空数据库
jedis.flushDB();
// 4. 测试SET命令
jedis.set("k1", "hello");
// 5. 测试GET命令
String resp = jedis.get("k1");
System.out.println("k1: " + resp);
// 6. 测试SET 选项NX命令
SetParams params = new SetParams();
params.nx(); // 不存在才新增
jedis.set("k1", "222", params);
resp = jedis.get("k1");
System.out.println("k1: " + resp);
}
}
}
- 测试EXISTS命令:
/**
* 测试EXISTS命令
* @author 米饭好好吃
*/
@Test
public void testEXISTS() {
// 1. 获取到redis连接对象
try(Jedis jedis = pool.getResource();) {
// 2. 配置密码(如果有的话)
jedis.auth("xxxxxx");
// 3. 清空数据库
jedis.flushDB();
// 4. 测试EXISTS命令
jedis.set("k1", "111");
boolean exists = jedis.exists("k1");
System.out.println("k1: " + exists);
jedis.del("k1");
exists = jedis.exists("k1");
System.out.println("k1: " + exists);
}
}
- 测试DEL命令:
/**
* 测试DEL命令
* @author 米饭好好吃
*/
@Test
public void testDEL() {
// 1. 创建redis连接对象
try(Jedis jedis = pool.getResource();) {
// 2. 配置密码(如果有的话)
jedis.auth("xxxxxx");
// 3. 清空数据库
jedis.flushDB();
// 4. 测试del命令
jedis.set("k1", "111");
jedis.set("k2", "222");
jedis.set("k3", "333");
long delCount = jedis.del("k1", "k2", "k3");
System.out.println("delCount: " + delCount);
String resp = jedis.get("k1");
System.out.println("k1: " + resp);
}
}
注意:DEL命令中参数列表为可边长参数,可以同时删除多个key,并且返回值为删除成功的个数,这与命令行中DEL命令一致
- 测试KEYS命令:
/**
* 测试KEYS命令
* @author 米饭好好吃
*/
@Test
public void testKEYS() {
// 1. 获取redis连接对象
try(Jedis jedis = pool.getResource();) {
// 2. 配置密码(如果有的话)
jedis.auth("xxxxxx");
// 3. 清空数据库
jedis.flushDB();
// 4. 测试KEYS命令
jedis.set("k1", "111");
jedis.set("k2", "222");
jedis.set("k3", "333");
Set<String> keys = jedis.keys("*");
System.out.println("keys: " + keys);
}
}
注意:KEYS命令返回的是一个Java当中的Set
类型,这是因为redis中的key都是不允许重复且对于顺序没有要求的,KEYS方法可以传递一个pattern
参数,即KEYS命令后紧跟的匹配模式
- 测试EXPIRE、TTL命令:
/**
* 测试EXPIRE命令
* @author 米饭好好吃
*/
@Test
public void testEXPIRE() {
// 1. 获取redis连接对象
try(Jedis jedis = pool.getResource();) {
// 2. 设置密码(如果有的话)
jedis.auth("xxxxxx");
// 3. 清空数据库
jedis.flushDB();
// 4. 测试expire、ttl
jedis.set("k1", "111");
jedis.expire("k1", 10);
long ttl = jedis.ttl("k1");
System.out.println("ttl: " + ttl);
}
}
- 测试TYPE命令:
/**
* 测试TYPE命令
* @author 米饭好好吃
*/
@Test
public void testTYPE() {
// 1. 获取redis连接对象
try(Jedis jedis = pool.getResource();) {
// 2. 设置密码(如果有的话)
jedis.auth("xxxxxx");
// 3. 清空数据库
jedis.flushDB();
// 4. 测试type命令
jedis.hset("k1", "f1", "v1");
jedis.lpush("k2", "11", "22", "33");
jedis.sadd("k3", "abc");
System.out.println("k1: " + jedis.type("k1"));
System.out.println("k2: " + jedis.type("k2"));
System.out.println("k3: " + jedis.type("k3"));
}
}