Java中使用Redis(Jedis)
本文介绍如何在Java中通过Jedis使用Redis。
Jedis快速入门
官方地址(Github)
Java的maven项目中使用jedis
- 使用IDEA创建maven项目
pom添加依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.3.0</version>
</dependency>
<!--junit-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.7.0</version>
<scope>test</scope>
</dependency>新建测试类来测试jedis
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
48package com.demo.jedis.test;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
/**
* jedis单元测试类
*/
public class JedisTest {
private Jedis jedis;
/**
* 当前单元测试类中,每次执行test之前都会执行的方法
*/
@BeforeEach
void setup(){
// 建立连接
jedis = new Jedis("192.168.200.123", 6379);
// 连接密码
jedis.auth("123321");
// 连接库
jedis.select(0);
}
/**
* 当前单元测试类中,每次执行test之后都会执行的方法
*/
@AfterEach
void tearDown(){
if(jedis != null){
jedis.close();
}
}
@Test
void testString(){
// 存入数据
String result = jedis.set("name", "Lisi");
System.out.println("result: " + result);
// 取出数据
String name = jedis.get("name");
System.out.println("name: " + name);
}
}
Jedis连接池
通过连接池获取redis连接(不用再通过new的方式创建连接)
1 |
|
Springboot项目与redis
SpringDataRedis介绍
Springboot项目中使用redis
- 创建Springboot项目
引入依赖
1
2
3
4
5
6
7
8
9
10<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>修改配置文件
[可选]:修改
resources
文件夹下的application.properties
文件为application.yml
yml 配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16spring:
redis:
host: 192.168.18.123
port: 6379
password: 123321
# 默认的 lettuce 连接池
lettuce:
pool:
max-active: 8
# 最大空闲连接
max-idle: 8
# 最小空闲连接
min-idle: 0
max-wait: 1000ms
# 数据库索引
database: 0redisTemplate 操作redis
”乱码“问题
如果直接进行上方的操作,我们在redis数据库可以看到,产生了像乱码一样的东西
这是因为默认序列化器的问题,RedisTemplate加载时有初始化一个默认序列化器(JDK的序列化器):
断点进redisTemplate.opsForValue().set()
方法查看源码:
查看rawValue(value)
的实现源码:
通过查看实现类可以看到,实现valueSerializer().serialize(value)
的序列化器有好几个,如果没有初始化的话,默认就是用JdkSerializationRedisSerializer
这个序列化器。
继续看JdkSerializationRedisSerializer
序列化器的实现:
最终是通过ObjectOutputStream
来序列化的。
解决方案:
自定义 RedisTemplate 配置:
1 |
|
如果有报错(jackson相关),需要添加 jackson 相关的包依赖,如果项目本身有依赖spring-mvc的话不会报错。
基本实现原理就是以上这样的,网上也可以查找相关:springboot redistemplate 配置
,都大同小异。
数据对象存储问题
通过指定的序列化器序列化之后,我们可以看到,如果存储的是对象,redis中会写入类信息,这样就多占用了很大一部分存储空间:
解决方案1,使用StringRedisTemplate,并进行手动反序列化:
1 |
|
RedisTemplate的两种序列化实践方案
方案一:
- 自定义
RedisTemplate
。 - 修改
RedisTemplate
的序列化器为GenericJackson2JsonRedisSerializer
方案二:
- 使用
StringRedisTemplate
。 - 写入Redis时,手动把对象序列化为JSON。
- 读取Redis时,手动把读取到的JSON数据反序列化为对象。