1.学习redis第一天---springboot集成redis----(SpringDataRedis)

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密码的可以看这篇文章

redis密码设置及其遇到问题的解决-CSDN博客

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路径了

注意:每次有的斜杠是正常的因为这是分号序列化之后变成的,详细请看

fastJSON序列化对象成字符串后,存入redis有反斜杠问题解决过程。_字符串序列化去除反斜杠-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值