Redis系列第2篇Jedis使用

简介

Jedis是Java操作Redis的。提供了非常全面的Redis命令支持。基于阻塞IO,且调用方法是同步的,程序流需要等到Sockets处理完IO才能执行,不支持异步。Jedis的客户端实例时不安全的,所以需要连接池来使用Jedis

基本使用

1.首先需要创建一个maven项目,导入如下的依赖文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>

2.测试连接是否正常,显示PONG表示连接正常

1
2
3
4
5
6
7
8
public class JedisDemo {
//测试是否能正常连接
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
String value = jedis.ping();
System.out.println(value);
}
}

操作string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//操作string
@Test
public void testString() throws InterruptedException {
//创建jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);

//添加一些数据
jedis.set("张三", "10010");
jedis.set("李四", "10011");
jedis.set("王五", "10012");
Set<String> keys = jedis.keys("*");
keys.forEach(System.out::println);

//判断key是否存在
System.out.println(jedis.exists("赵六") + "," + jedis.exists("张三"));

//设置带有过期时间的数据
jedis.setex("Jacket", 20, "10030");
Thread.sleep(2000);

//获取ttl(返回具有超时时间的键的剩余生存时间)
System.out.println(jedis.ttl("张三"));
System.out.println(jedis.ttl("Jacket"));

//获取值
System.out.println(jedis.get("李四"));

//设置多个key-value
jedis.mset("k1", "v1", "k2", "v2");
System.out.println(jedis.mget("k1", "k2"));
}

操作list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//操作list
@Test
public void testList() {
//创建jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);

//lpush表示从左往右,顺序与插入顺序相反
jedis.lpush("key1", "luck", "mary", "jack");

//stop参数中-1表示所有值,可以使用llen获取长度
List<String> values = jedis.lrange("key1", 0, -1);
System.out.println(values);

//rpush表示从右往左,顺序与插入顺序相同
jedis.rpush("key2", "luck", "mary", "jack");
List<String> lrange = jedis.lrange("key2", 0, jedis.llen("key2"));
System.out.println(lrange);
}

操作set

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//操作set
@Test
public void testSet() {
//创建jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);

jedis.sadd("users", "user1");
jedis.sadd("users", "user2");
jedis.sadd("users", "user3");
jedis.sadd("users", "user4");

jedis.srem("users", "user4"); //移除指定元素

System.out.println(jedis.scard("users")); //返回集合中元素个数
System.out.println(jedis.srandmember("users")); //返回一个随机元素
System.out.println(jedis.smembers("users")); //返回所有元素
System.out.println(jedis.sismember("users", "user4")); //判断user4是否是集合中的一个元素
}

操作zset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//操作zset
@Test
public void testZSet() {
//创建jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);

jedis.zadd("class",100d, "zhangsan");
jedis.zadd("class",99d ,"lisi");
jedis.zadd("class",85d, "wangwu");
jedis.zadd("class",75d, "sss");
jedis.zadd("class",65d, "aaa");
jedis.zadd("class",55d, "bbb");

System.out.println(jedis.zrange("class",0,-1)); //获取所有
System.out.println(jedis.zrangeByScore("class", 60D, 80D)); //返回60到80之间的
}

操作map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//操作map
@Test
public void testMap() {
//创建jedis对象
Jedis jedis = new Jedis("127.0.0.1", 6379);

Map<String, String> students = new HashMap<>();
students.put("A", "a1");
students.put("B", "b2");
students.put("C", "c3");
students.put("D", "4d");

jedis.hmset("stu", students); //存储

jedis.hdel("stu", "D"); //删除某个值
System.out.println(jedis.hlen("stu")); //获取Map集合大小
System.out.println(jedis.exists("D")); //时候存在某个键的记录
System.out.println(jedis.hkeys("stu")); //返回Map集合的所有key
System.out.println(jedis.hvals("stu")); //返回Map集合的所有value
}

综合案例

本案例模拟了手机发送验证码登录校验的过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
public class PhoneCode {
@Test
public void testSend() {
verifyCode("123456");
}

@Test
public void testCheck() {
getRedisCode("123456","813002");
}

//验证码校验
private static void getRedisCode(String phone, String code) {
//从redis中获取验证码
Jedis jedis = new Jedis("127.0.0.1", 6379);

//验证码key
String codeKey = "VerifyCode" + phone + ":code";
String redisCode = jedis.get(codeKey);

//判断
if (redisCode.equals(code)) {
System.out.println("验证成功");
} else {
System.out.println("验证失败");
}
jedis.close();
}

//每个手机一天只能发送三次,验证码放到redis中,设置过期时间
private static void verifyCode(String phone) {
//连接redis
Jedis jedis = new Jedis("127.0.0.1", 6379);

//手机发送次数key
String countKey = "VerifyCode" + phone + ":count";

//验证码key
String codeKey = "VerifyCode" + phone + ":code";

//一天只能发送三次
String count = jedis.get(codeKey);
if (count == null) {
//第一次发送
jedis.setex(countKey, 24 * 60 * 60, "1");
} else if (Integer.parseInt(count) <= 2) {
//发送次数加一
jedis.incr(codeKey);
} else if (Integer.parseInt(count) > 2) {
//第三次不能继续发送
System.out.println("今天已经超过三次了,明天再试");
jedis.close();
return;
}

//验证码放到redis中去
String vCode = getCode();
jedis.setex(codeKey, 120, vCode);

//显示手机号,验证码
System.out.println(phone + "," + vCode);
jedis.close();
}

//生成6位验证码
private static String getCode() {
Random random = new Random();
String code = "";
for (int i = 0; i < 6; i++) {
int rand = random.nextInt(10);
code += rand;
}
return code;
}
}

Redis系列第2篇Jedis使用
https://www.eldpepar.com/coding/10096/
作者
EldPepar
发布于
2023年3月4日
许可协议