返回顶部
首页 > 资讯 > 精选 >SpringBoot怎么结合Redis实现序列化
  • 184
分享到

SpringBoot怎么结合Redis实现序列化

2023-07-02 06:07:13 184人浏览 八月长安
摘要

这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。配置类配置

这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。

配置类

配置 Jackson2JSONRedisSerializer 序列化策略

下面就开始自动配置类的书写

我使用的是 Jackson2jsonRedisSerializer 来对对象进行序列化,所以首先需要一个方法,来配置 Jackson2JsonRedisSerializer 序列化策略

private Jackson2JsonRedisSerializer<Object> serializer() {        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);        ObjectMapper objectMapper = new ObjectMapper();        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);        return jackson2JsonRedisSerializer;    }

这里要注意的是

objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);

这一句,这一句非常的重要,作用是序列化时将对象全类名一起保存下来

设置之后的序列化结果如下:

[
    "com.buguagaoshu.redis.model.User",
    {
        "name": "1",
        "age": "11",
        "message": "牛逼"
    }
]

不设置的话,序列化结果如下,将无法反序列化

{
        "name": "1",
        "age": "11",
        "message": "牛逼"
    }

一开始,我在网上搜了一下,发现大多数教程因为时间的原因,这一句用的是

objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

但当我把这段代码写入的时候,发现idea提示我

SpringBoot怎么结合Redis实现序列化

着是一个过时的方法,由于我当时并不知道这句话的意思,就把这段代码注释了,觉得可能没什么用,但注释后在向Redis里写数据的时候,数据会变成

SpringBoot怎么结合Redis实现序列化

SpringBoot怎么结合Redis实现序列化

导致数据无法反序列化。

最后我查看了这个方法的源码,找到了

SpringBoot怎么结合Redis实现序列化

SpringBoot怎么结合Redis实现序列化

通过注释,我得到了这段代码的最新写法。

也明白了这段代码的作用。

配置  RedisTemplate

@Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        redisTemplate.setValueSerializer(serializer());        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // 使用StringRedisSerializer来序列化和反序列化redis的key值        redisTemplate.seTKEySerializer(stringRedisSerializer);        // hash的key也采用String的序列化方式        redisTemplate.setHashKeySerializer(stringRedisSerializer);        // hash的value序列化方式采用jackson        redisTemplate.setHashValueSerializer(serializer());        redisTemplate.afterPropertiesSet();        return redisTemplate;    }

这里就没有什么需要注意的了,按照自己的需求,来配置序列化的方式

配置缓存策略

@Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        // 配置序列化(解决乱码的问题)        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                // 缓存有效期                .entryTtl(timeToLive)                // 使用StringRedisSerializer来序列化和反序列化redis的key值                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))                // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer()))                // 禁用空值                .disableCachingNullValues();        return RedisCacheManager.builder(factory)                .cacheDefaults(config)                .build();    }

测试代码

@SpringBootTestpublic class RedisApplicationTests {    @Autowired    private RedisTemplate<String, Object> redisTemplate;    @Test    void contextLoads() throws Exception {        User user = new User();        user.setName("15");        user.setAge(20);        user.setMessage("牛逼");        redisTemplate.opsForValue().set(user.getName(), user);        User getUser = (User) redisTemplate.opsForValue().get(user.getName());        System.out.println(getUser);        System.out.println(getUser.getMessage());    }}

再来查看Redis中的数据

SpringBoot怎么结合Redis实现序列化

数据正常,并且系统也能正常的反序列化了。

完整代码

package com.buguagaoshu.redis.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;import org.springframework.beans.factory.annotation.Value;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachinGConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializationContext;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    @Value("${spring.cache.redis.time-to-live}")    private Duration timeToLive = Duration.ZERO;        private Jackson2JsonRedisSerializer<Object> serializer() {        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);        ObjectMapper objectMapper = new ObjectMapper();        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);        return jackson2JsonRedisSerializer;    }    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(redisConnectionFactory);        // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值        redisTemplate.setValueSerializer(serializer());        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // 使用StringRedisSerializer来序列化和反序列化redis的key值        redisTemplate.setKeySerializer(stringRedisSerializer);        // hash的key也采用String的序列化方式        redisTemplate.setHashKeySerializer(stringRedisSerializer);        // hash的value序列化方式采用jackson        redisTemplate.setHashValueSerializer(serializer());        redisTemplate.afterPropertiesSet();        return redisTemplate;    }    @Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        // 配置序列化(解决乱码的问题)        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                // 缓存有效期                .entryTtl(timeToLive)                // 使用StringRedisSerializer来序列化和反序列化redis的key值                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))                // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer()))                // 禁用空值                .disableCachingNullValues();        return RedisCacheManager.builder(factory)                .cacheDefaults(config)                .build();    }}

关于“SpringBoot怎么结合Redis实现序列化”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SpringBoot怎么结合Redis实现序列化”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: SpringBoot怎么结合Redis实现序列化

本文链接: https://lsjlt.com/news/340016.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot怎么结合Redis实现序列化
    这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。配置类配置...
    99+
    2023-07-02
  • SpringBoot结合Redis实现序列化的方法详解
    目录前言配置类配置 Jackson2JsonRedisSerializer 序列化策略配置  RedisTemplate配置缓存策略测试代码完整代码前言 最近在学...
    99+
    2024-04-02
  • SpringBoot怎么整合Redis实现序列化存储Java对象
    今天小编给大家分享一下SpringBoot怎么整合Redis实现序列化存储Java对象的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-05
  • SpringBoot怎么自定义Redis实现缓存序列化
    本篇内容主要讲解“SpringBoot怎么自定义Redis实现缓存序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么自定义Redis实现缓存序列化”吧!1、自定义Red...
    99+
    2023-07-02
  • SpringBoot 如何实现自定义Redis序列化
    目录问题环境入口点实现自定义序列化小结问题 在使用RedisTemplate存储对象时,如果采用JDK默认的序列化方式,数据会出现许多编码字符,辨析度不高。比如一个空的User对象,...
    99+
    2024-04-02
  • SpringBoot整合redis中的JSON序列化文件夹操作小结
    目录前言快速配置JSON序列化jackson序列化Fastjson序列化需要倒入Fastjson到依赖分析参考对比更多问题参考redis数据库操作前言 最近在开发项目,用到了redi...
    99+
    2024-04-02
  • Redis持久化与序列化怎么实现
    Redis持久化和序列化是两个不同的概念,它们分别用于将数据保存到磁盘上以及将数据转换成字节流进行传输。 Redis持久化可以通过两...
    99+
    2024-04-29
    Redis
  • SpringBoot整合Redis实现序列化存储Java对象的操作方法
    目录一、背景1、思考2、方案二、源码分析三、注入RedisTemplate1、引入依赖2、Redis 连接信息3、Redis 核心配置类4、Redis工具类四、测试1、创建 Java 实体类 UserInfo2、测试用例...
    99+
    2023-03-23
    SpringBoot整合Redis序列化存储Java对象 SpringBoot整合Redis SpringBoot Redis序列化存储
  • golang结构体序列化怎么实现
    在Go中,可以使用encoding/json包来实现结构体的序列化和反序列化。 首先,需要导入encoding/json包: imp...
    99+
    2023-10-22
    golang
  • SpringBoot自定义Redis实现缓存序列化详解
    目录1、自定义RedisTemplate1.1、Redis API默认序列化机制1.2、自定义RedisTemplate序列化机制1.3、效果测试2、自定义RedisCacheMan...
    99+
    2024-04-02
  • Redis中的消息队列序列化怎么实现
    在Redis中实现消息队列序列化可以使用各种不同的方法,其中一种常见的方法是使用JSON序列化。可以将消息数据转换为JSON格式存储...
    99+
    2024-04-29
    Redis
  • redis怎么序列化
    redis根据数据类型自动选择不同的序列化方式:字符串数据类型:resp(文本协议)哈希数据类型:rdb(二进制格式)位图和有序集合数据类型:sds(二进制格式)geo数据类型:geo序...
    99+
    2024-05-21
    redis 键值对
  • redis如何实现序列化
    redis实现序列化的示例:Redis提供了两个模板类RedisTemplate和StringRedisTemplate实现序列化,如:RedisAutoConfiguration源码,对key和value进行序列化:public clas...
    99+
    2024-04-02
  • springboot序列化和反序列化怎么定义
    在Spring Boot中,序列化和反序列化可以通过以下方式进行定义:1. 实现Serializable接口:在需要进行序列化和反序...
    99+
    2023-08-14
    springboot
  • 怎么用Protobuf与Redis实现高效序列化
    要使用 Protobuf 与 Redis 实现高效序列化,可以按照以下步骤进行: 定义 Protobuf 消息类型:首先需要定义...
    99+
    2024-04-29
    Redis Protobuf
  • Vue结合Springboot怎么实现用户列表单页面
    本篇内容主要讲解“Vue结合Springboot怎么实现用户列表单页面”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue结合Springboot怎么实现用户列...
    99+
    2024-04-02
  • Java序列化与反序列化怎么实现
    本篇内容主要讲解“Java序列化与反序列化怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java序列化与反序列化怎么实现”吧!序列化与反序列化概念序列化 (Serialization)是...
    99+
    2023-06-02
  • PHP与Redis序列化会话存储怎么实现
    在PHP中,可以使用Redis作为会话存储的后端,以实现会话持久化和共享。为了实现这个目标,可以使用PHP的Redis扩展来连接到R...
    99+
    2024-04-29
    Redis PHP
  • redis怎么实现并列排序
    Redis可以通过有序集合(Sorted Set)来实现并列排序。有序集合是一种特殊的数据结构,其中的每个成员都关联着一个分数(sc...
    99+
    2023-09-06
    redis
  • redis自增序列怎么实现
    Redis自增序列可以通过以下几种方式实现:1、使用INCR命令:使用Redis的INCR命令可以对一个指定的键进行自增操作。比如,...
    99+
    2023-05-23
    redis自增序列 redis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作