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
运行结果:
[雷姆, 拉姆, 艾米莉雅]