5.SpringBoot整合Redis

105 阅读1分钟

1.导入项目所需依赖

<?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>2.4.2</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

    <groupId>com.mawkun</groupId>

    <artifactId>redis</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <name>redis</name>

    <description>redis skills</description>

    <properties>

        <java.version>1.8</java.version>

    </properties>

    <dependencies>

        <!-- springboot整合redis依赖 -->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-redis</artifactId>

        </dependency>

        <!-- jedis依赖 -->

        <dependency>

            <groupId>redis.clients</groupId>

            <artifactId>jedis</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <!-- fastJson -->

        <dependency>

            <groupId>com.alibaba</groupId>

            <artifactId>fastjson</artifactId>

            <version>1.2.73</version>

        </dependency>

2.配置文件,redis配置

spring.redis.host=127.0.0.1

spring.redis.port=6379

3.编码测试

@Data
class User implements Serializable{
String userName;
Integer age;
}

Image.png

可正常从redis中获取user对象

4.配置源码解析

Image.png

Image.png

Image.png

5.问题

  • key,value出现乱码

Image.png

  • 什么原因导致的乱码呢? 查看RedisTemplate源码

Image.png

源码中我们可以看到redisTemplate默认使用的是JDK提供的序列化机制,JDK序列化机制导致的乱码。

  • 解决方案 既然是jdk序列化机制导致的乱码,那么我们只需要修改redisTemplate序列化机制就可以解决该问题
    • 首先自定义一个redisTemplate
@Bean

public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

//开发过程中,一般直接使用<String, Object>

RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();

template.setConnectionFactory(redisConnectionFactory);

//Json序列化配置

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.Defau ltTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

//String的序列化

StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

//key采用string的序列化方式

template.setKeySerializer(stringRedisSerializer);

//hash的key也采用String的序列化方式

template.setHashKeySerializer(stringRedisSerializer);

//value的序列化方式采用jackson

template.setValueSerializer(jackson2JsonRedisSerializer);

//hash的value序列化方式采用jackson

template.setHashValueSerializer(jackson2JsonRedisSerializer);

template.afterPropertiesSet();

return template;

}

Image.png

扩展:什么是序列化?为什么需要序列化?