Java 连接 Redis
# 100.Java 连接 Redis
我们可以使用 Jedis ,通过 Java 来操作 Redis。该依赖类似 JDBC 中的驱动类,使用它,Java 就可以连接 Redis 并操作了
# Jedis
Jedis 是一个 Java 操作 Redis 的工具。
Redis 提供了几十种不同编程语言的客户端库,这些库都很好地封装了 Redis 的命令,使得在程序中与 Redis 进行交互变得更容易。有些库还提供了可以将编程语言中的数据类型直接以相应的形式存储到 Redis 中(如将数组直接以列表类型存入 Redis)的简单方法,使用起来非常方便。
# 下载依赖
下载 Jedis 的 jar 包,并导入,或者用 Maven:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.1</version>
</dependency>
2
3
4
5
# 入门案例
操作 Redis 很简单:
- 获取 Redis 连接
- 操作 Redis
- 关闭 Redis 连接
package com.peterjxl;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
@Test
public void helloJedis(){
// 1.获取连接
Jedis jedis = new Jedis("localhost", 6379);
// 2. 操作 Redis
jedis.set("username", "peterjxl");
// 3.关闭连接
jedis.close();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在运行测试方法之前,记得先启动 Redis 服务端。运行户,我们可以通过 Redis-cli 查看,是设置成功的:
127.0.0.1:6379> get username
"peterjxl"
2
我们获取 Redis 连接的时候,如果使用空参构造 Jedis 对象,则默认连接的是 localhost:6379
# Jedis 操作 Redis 中的数据
接下来,我们来使用 Jedis 操作 Redis 的各类型数据。在 Jedis 中,操作各类数据的方法名,和 Redis 的命令几乎是一样的,例如 Redis 中操作 string 类型的数据,命令是 get 和 set;Jedis 中也是一样的方法名。
# 测试类改造
我们可以将 Jedis 获取连接和释放连接的方法抽取出来,并用@Before 和 @After 注解改造。
package com.peterjxl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
Jedis jedis;
@Before
public void init(){
jedis = new Jedis();
}
@After
public void destroy(){
jedis.close();
}
@Test
public void helloJedis(){
jedis.set("username", "peterjxl");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 操作字符串类型 string
存取 string 数据:set 方法、get 方法
@Test
public void jedisString(){
jedis.set("username", "peterjxl");
String username = jedis.get("username");
System.out.println(username);
}
2
3
4
5
6
存储带有效期的数据:setex()
方法,例如存储激活码、验证码
jedis.setex("activecode", 20, "hehe"); //20 秒后自动删除该键值对
# 操作哈希类型 hash
Redis 中,操作 hash 的命令主要有:hset、hget、hgetAll。在 Jedis 中也是一样的:
@Test
public void jedisHash(){
// 存储数据
jedis.hset("user", "name", "lisi");
jedis.hset("user", "age", "23");
jedis.hset("user", "gender", "female");
// 获取数据
String name = jedis.hget("user", "name");
System.out.println("name: " + name);
// 获取 hash 的所有 map 中的数据
Map<String, String> user = jedis.hgetAll("user");
Set<String> keySet = user.keySet();
for(String key : keySet){
String value = user.get(key);
System.out.println(key + " : " + value);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
运行结果:
name: lisi
gender : female
name : lisi
age : 23
2
3
4
# 操作列表类型 list
list 的主要操作有:lpush / rpush,lpop / rpop,lrange start end。Jedis 中演示如下:
@Test
public void jedisList(){
// 存储数据
jedis.lpush("myList", "a", "b", "c"); //从左开始存,结果是 cba
jedis.rpush("myList2", "a", "b", "c"); //从右开始存,结果是 abc
// 获取数据
List<String> myList = jedis.lrange("myList", 0, -1);
List<String> myList2 = jedis.lrange("myList2", 0, -1);
System.out.println("myList: " + myList);
System.out.println("myList2: " + myList2);
// list 弹出数据
String element1 = jedis.lpop("myList"); //c
String element2 = jedis.rpop("myList"); //a
System.out.println("element1: " + element1);
System.out.println("element2: " + element2);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
运行结果:
myList: [c, b, a]
myList2: [a, b, c]
element1: c
element2: a
2
3
4
# 操作集合类型 set
和 set 相关的命令有:sadd,smembers
@Test
public void jedisSet(){
// set 存储
jedis.sadd("mySet","java","php","c++");
// set 获取
Set<String> myset = jedis.smembers("mySet");
System.out.println(myset);
}
2
3
4
5
6
7
8
9
运行结果:
[c++, java, php]
# 操作有序集合类型 sortedset
和 sortedset 相关的命令有:zadd,zrange
@Test
public void jedisSortedSet(){
// sortedset 存储
jedis.zadd("mySortedSet", 3, "雷姆");
jedis.zadd("mySortedSet", 30, "拉姆");
jedis.zadd("mySortedSet", 55, "艾米莉雅");
// sortedset 获取
Set<String> mysortedset = jedis.zrange("mySortedSet", 0, -1);
System.out.println(mysortedset);
}
2
3
4
5
6
7
8
9
10
11
运行结果:
[雷姆, 拉姆, 艾米莉雅]