【SpringBoot】34、SpringBoot整合Redis实现序列化存储Java对象

【SpringBoot】34、SpringBoot整合Redis实现序列化存储Java对象前面我们已经介绍过【SpringBoot】十七、SpringBoot中整合Redis,我们可以看出,在SpringBoot对Redis做了一系列的自动装配,使用还是非常方便的一、背景1、思考‘通过我们前面的学习,我们已经可以往Redis中存入字符串,那么我们要往Redis中存入Java对象该怎么办呢?2、方案我们可以将Java对象转化为JSON对象,然后转为JSON字符串,存入Redis,那么我们从Redis中取出该数据的时候,我们也只能取出字符串,并转

大家好,又见面了,我是你们的朋友全栈君。

前面我们已经介绍过【SpringBoot】十七、SpringBoot 中整合 Redis,我们可以看出,在 SpringBoot 对 Redis 做了一系列的自动装配,使用还是非常方便的

一、背景

  • 1、思考
    通过我们前面的学习,我们已经可以往 Redis 中存入字符串,那么我们要往 Redis 中存入 Java 对象该怎么办呢?
  • 2、方案
    我们可以将 Java 对象转化为 JSON 对象,然后转为 JSON 字符串,存入 Redis,那么我们从 Redis 中取出该数据的时候,我们也只能取出字符串,并转为 Java 对象,这一系列的操作是不是显得有些麻烦呢?

二、源码分析

RedisAutoConfiguration

  • 以上是 RedisAutoConfiguration 类中的源码片段,可以看出 SpringBoot 对 Redis 做自动化配置的时候,在容器中注入了 redisTemplate 和 stringRedisTemplate
  • 其中,RedisTemplate<Object, Object> 表示,key 的类型为 Object,value 的类型为 Object,但是我们往往需要的是 RedisTemplate<String, Object>,这就需要我们重新注入一个 RedisTemplate 的 Bean,它的泛型为 RedisTemplate<String, Object>,并设置 key,value 的序列化方式
  • 看到这个@ConditionalOnMissingBean注解后,就知道如果Spring容器中有了RedisTemplate对象了,这个自动配置的RedisTemplate不会实例化。因此我们可以直接自己写个配置类,配置RedisTemplate。

三、注入RedisTemplate

  • 1、引入依赖
<!-- redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

以上引入了 redis 的依赖,其余依赖请自行添加

  • 2、Redis 连接信息
spring:
  # Redis配置
  redis:
    host: 127.0.0.1
    port: 6379
    database: 10
    jedis:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 50
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: 3000ms
        # 连接池中的最大空闲连接数
        max-idle: 20
        # 连接池中的最小空闲连接数
        min-idle: 5
    # 连接超时时间(毫秒)
    timeout: 5000ms
  • 3、Redis 核心配置类

Redis 的核心配置我们放在 RedisConfig.java 文件中

package com.zyxx.redistest.common;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/** * @ClassName RedisConfig * @Description * @Author Lizhou * @Date 2020-10-22 9:48:48 **/
@Configuration
public class RedisConfig { 

/** * RedisTemplate配置 */
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { 

// 配置redisTemplate
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jackson2JsonRedisSerializer.setObjectMapper(om);
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// Hash key序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// Hash value序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

我们注入了一个名称为 redisTemplate,类型为 RedisTemplate<String, Object> 的 Bean,key 采用 StringRedisSerializer 序列化方式,value 采用 Jackson2JsonRedisSerializer 序列化方式

  • 4、Redis工具类

我们将对 Redis 进行的一系列操作放在 RedisUtils.java 文件中

package com.zyxx.redistest.common;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
/** * @ClassName RedisUtils * @Description * @Author Lizhou * @Date 2020-10-22 10:10:10 **/
@Slf4j
@Component
public class RedisUtils { 

@Autowired
private RedisTemplate<String, Object> redisTemplate;
/** * 根据key读取数据 */
public Object get(final String key) { 

if (StringUtils.isBlank(key)) { 

return null;
}
try { 

return redisTemplate.opsForValue().get(key);
} catch (Exception e) { 

e.printStackTrace();
}
return null;
}
/** * 写入数据 */
public boolean set(final String key, Object value) { 

if (StringUtils.isBlank(key)) { 

return false;
}
try { 

redisTemplate.opsForValue().set(key, value);
log.info("存入redis成功,key:{},value:{}", key, value);
return true;
} catch (Exception e) { 

log.error("存入redis失败,key:{},value:{}", key, value);
e.printStackTrace();
}
return false;
}
}

我们写入了 get,set 两个方法用于测试

四、测试

  • 1、创建 Java 实体类 UserInfo
package com.zyxx.redistest.common;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/** * @ClassName UserInfo * @Description * @Author Lizhou * @Date 2020-10-22 10:12:12 **/
@Data
public class UserInfo implements Serializable { 

/** * id */
private Integer id;
/** * 姓名 */
private String name;
/** * 创建时间 */
private Date createTime;
}
  • 2、测试用例
package com.zyxx.redistest;
import com.zyxx.redistest.common.RedisUtils;
import com.zyxx.redistest.common.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
class RedisTestApplicationTests { 

@Autowired
private RedisUtils redisUtil;
@Test
void contextLoads() { 

UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setName("jack");
userInfo.setCreateTime(new Date());
// 放入redis
redisUtil.set("user", userInfo);
// 从redis中获取
System.out.println("获取到数据:" + redisUtil.get("user"));
}
}

我们向 Redis 中存入了一个 key 为 ”user“,value 为 UserInfo 对象的数据,然后再根据 key 获取该数据

  • 3、测试结果
    测试结果
    可以看出,我们往 Redis 中成功存入 Java 对象数据,并成功获取到了该对象

如您在阅读中发现不足,欢迎留言!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/151621.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Android入门学习教程PDF免费下载

    Android入门学习教程PDF免费下载场景Android(安卓)是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。2005年由Google收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。实现关注公众号:霸道的程序猿回复:Android书籍免费下载。…

  • zencart模板,外贸鞋子模板

    zencart模板,外贸鞋子模板演示地址:http://www.zentem.com/shoes1

  • CCD传感器成像、尺寸、曝光时间「建议收藏」

    CCD传感器成像、尺寸、曝光时间「建议收藏」参考博主@机器视觉001的博文https://blog.csdn.net/liubing8609/article/details/78254703工业相机,最本质的功能就是将光信号转变成有序的电信号。CCD传感器成像过程1.用相机拍摄景物时,景物反射的光线通过相机的镜头透射到CCD上。2.当CCD曝光后,光电二极管受到光线的激发释放出电荷,感光元件的电信号便由此产生。3….

  • vim编辑器重要快捷键及vim设置「建议收藏」

    vim编辑器重要快捷键及vim设置「建议收藏」1.全选:ggVG2.跳转到文本最后一行:shift+g3.跳转到文本第一行:gg4.跳转到光标所选行的行首位置:05.跳转到光标所选行的行尾位置:shift+46.全部替换(替换无需确认)::%s/src/dst/g7.全部替换(每次替换需要确认)::%s/src/dst/gc8.查找:/string9.高亮显示查找到的内容::sethlsearch10.显示vim行号::setnu!11.到注释的开始:[/12.到注释的结束:]/13.撤销上一次操作:

  • Redis和Memcached的区别

    Redis和Memcached的区别

  • host配置_win10hosts文件配置异常

    host配置_win10hosts文件配置异常host添加地址今天是我第一天入职,坐到工位的第一件事就是配置host,因为连接测试环境需要本地授权,所以要配置。这里简单记录下配置中遇到的问题和操作的步骤操作环境是win10,之前公司一直使用的win7系统,所以对win10系统不是很熟悉,还要多多使用才行。使用win自带功能添加1.点击【此电脑】,路径为:C:\Windows\System32\drivers\etc选择hos…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号