Jedis

快速入门

  1. 引入依赖
1
2
<groupId>redis.chlients</groupId>
<artifactId>jedis</xxx>
  1. 建立连接
1
2
3
4
5
6
void setUp(){
jedis = new Jedis("IP地址" ,6379);
jedsi.auth("密码");
jedis.select("1"); //选择数据库

}
  1. 操作数据,测试String
1
2
3
4
5
6
void testString(){
String result = jedis.set("name","张三");
sout
Sitrng name = jedis.get("name");
sout
}
  1. 关闭连接
1
2
3
4
5
void tearDown(){
if(jedis != null){
jedis.close();
}
}

springDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成

其中对Redis的集成模块就叫做SpringDataRedis

官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

RedisTemplate工具类

img

使用RedisTemplate统一API来操作Redis

  1. 导入依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
  1. 创建RedisTemplate对象
1
2
@Resource
private RedisTemplate redisTemplate;
  1. 实现对数据的操作
1
2
3
4
5
6
7
8
@Test
void testString() {
//写入一条数据
redisTemplate.opsForValue().set("name","虎哥");

Object name = redisTemplate.opsForValue().get("name");
System.out.println(name);
}

得到的结果:

img

img

​ 需要解决的问题

因为使用redisTemplate.opsForValue().set(“name”,”虎哥”);得到的不是一个String 类型的字符串,而使一个Object对象

所以存入的就会是java对象,那么就需要对对象进行序列化,从而得到我们需要的类型

解决RedisTemplate序列化的两种方案

方案一:

  1. 自定义RedisTemplate
  2. 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
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
package second.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
* 创建配置文件的原因:
* 但我们进行写入操作时,在redis数据库中存储的确实一段\xAC\xED\x00\x05t\x00\x06\xE8\x99\x8E\xE5\x93\xA5
*/
@Configuration
public class RedisTemplateConfig {

@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//创建redisTemplate对象
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
//连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);

//创建json序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//设置key序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());

//设置value序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
//返回
return redisTemplate;
}
}

得到的结果

img

这样就是我们所需要的结果,但是与此同时,他却不满足内存的要求,因为他多了一个@Class:”second.pojo.user” 这是我们自己定义的接收数据的实体类。他将会占用很大的内存。所以我们就不能这么做。就需要再次进行升级

方案二:

  1. 使用StringRedisTemplate
  2. 写入Redis时,手动把对象序列化为JSON
  3. 读取Redis时,手动把读取到的JSON反序列化为对象

通过这样得到的结果才是我们真正需要的结果

而Spring官方也同样推出了一个更为好用的**StringRedisTemplate统一API来操作Redis**

如下:

1
2
@Resource
private StringRedisTemplate stringRedisTemplate;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public ObjectMapper mapper = new ObjectMapper();
@Test
void getTest() throws JsonProcessingException {
user usr1 = new user("小花", 21);
//手动序列化 : 将java对象转换为json
String s = mapper.writeValueAsString(usr1);
//进行操作
stringRedisTemplate.opsForValue().set("user:300",s);
System.out.println("s==" + s);
//读取数据
String s1 = stringRedisTemplate.opsForValue().get("user:300");
user user = mapper.readValue(s1, user.class);
System.out.println("数据为 : " + user);
/**
* 得到的数据(在redis中存储的) :
* {
* "name": "小花",
* "age": 21
* }
*/
}

img