1.创建一个springboot工程
1.新建项目
选择maven,我的java选择17,jdk选择21
2.选择依赖和版本
这里的springboot是最新的3.3.3(lombok是一个记录日志相关的依赖,可以不选)
以下是我的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
这里有个细节需要额外引入连接池以来我这里用的pool2
2.写配置文件,用来配置redis相关信息
因为我个人喜欢用yml文件,所以用的yml文件,喜欢用properties的小伙伴可以用properties
spring:
application:
name: springboot-redis-demo # 应用名称
data:
redis:
host: 127.0.0.1 # redis地址,因为是在自己的电脑上面部署,所以用的本机ip
port: 6379 #端口号
password: 123456 # 密码
lettuce: #redis相关配置
pool: #连接池配置
max-active: 8 #最大连接数
max-idle: 8 #最大空闲连接数
min-idle: 0 #最小空闲连接数
max-wait: 100ms #最大等待时间
在这里有个小白不会设置redis密码的可以看这篇文章
3.使用redistemplate
redistemplate是spring自动装配的,专门用来集成redis的
1.没有任何序列化配置
package com.example.demo;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest//测试注解
@SuppressWarnings("all")
public class text {
@Autowired
private RedisTemplate Template; //redistemplate对象
@Test
void textstring()
{
Template.opsForValue().set("pass", "zhang"); //设置redis键值对
System.out.println(Template.opsForValue().get("pass"));//打印键值对
}
}
测试完以后,打开redis-cli服务查看
查看key发现这个键并不是我们所需要的pass,并且值也不一样
这是为啥呢?
在使用set方式后使用的jdk序列化器,
所以我们向redis写入数据或者读取数据时,是需要序列化的,而这个序列化是用的jdk序列化器,转换成字节的形式所以才会出现这样,现在我们要咋解决呢?
2.自己配置序列化
package com.example.demo.redisinit;
import org.springframework.beans.factory.annotation.Autowired;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
@Configuration
public class redisconfig
{
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory)
{
// 1.创建redistemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
// 2.创建连接工厂
template.setConnectionFactory(factory);
// 3.创建json序列化工具
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 4.设置key序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 5.设置value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
这里我们的值使用的json序列化
测试:
package com.example.demo;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest//测试注解
@SuppressWarnings("all")
public class text {
@Autowired
private RedisTemplate<String ,Object> Template; //redistemplate对象
@Test
void textstring()
{
Template.opsForValue().set("pass", "zhang"); //设置redis键值对
System.out.println(Template.opsForValue().get("pass"));//打印键值对
}
}
打开redis服务查看值
会出现有两个斜杠,而且当我们把值变成对象的时候我们再来测试一下
1.先创建一个对象
package com.example.demo.student;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor //无参构造
@AllArgsConstructor//有参构造
@Data
public class user
{
private String username;
private String password;
}
2.开始测试
@Test
void text1()
{
user user = new user("li", "123456");
Template.opsForValue().set("pass", user); //设置redis键值对
System.out.println(Template.opsForValue().get("pass"));//打印键值对
}
运行之后打开redis服务
他不仅多了斜杠还有一个@class因为jackson2JsonRedisSerializer序列化会带上路径信息代表序列化哪个对象,不难发现,这一个对象还好,如果对象变得很多很多,那这样占用的内存和效率不就很慢了吗?针对这个问题,spring也想到了,所以提出下面这种思想
4.使用StringRedisTemplate
package com.example.demo;
import com.example.demo.student.user;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
@SpringBootTest
@SuppressWarnings("all")
class DemoApplicationTests {
// spring提供的redis模板,可以直接序列化为字符串,但是如果只是值是对象的话需要手动序列化
// @Autowired
// private StringRedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate redisTemplate;
// springmvc自带的序列化器
private static final ObjectMapper objectMapper = new ObjectMapper();
@Test
void textstring()
{
redisTemplate.opsForValue().set("pass", "zhang");
System.out.println(redisTemplate.opsForValue().get("pass"));
}
@Test
void testpeople() throws JsonProcessingException {
// 1.创建一个对象
user user = new user("li", "123456");
// 2.手动序列化
String json = objectMapper.writeValueAsString(user);
// 3.存入redis
redisTemplate.opsForValue().set("user2", json);
// 4.读取数据
String json2 = redisTemplate.opsForValue().get("user2");
System.out.println(json2);
// 5.反序列化
user user2 = objectMapper.readValue(json2, user.class);
System.out.println(user2);
}
}
1.因为当你存入或者取出的时候都是string格式所以第一个不需要自己手动序列化,StringRedisTemplate里面序列化结果就是string类型,但是当你存入或者取出的是对象时需要自己手动序列化,运行结果如下:
这样就不没有class路径了
注意:每次有的斜杠是正常的因为这是分号序列化之后变成的,详细请看