iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot怎么自定义Redis实现缓存序列化
  • 476
分享到

SpringBoot怎么自定义Redis实现缓存序列化

2023-07-02 18:07:17 476人浏览 八月长安
摘要

本篇内容主要讲解“SpringBoot怎么自定义Redis实现缓存序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springBoot怎么自定义Redis实现缓存序列化”吧!1、自定义Red

本篇内容主要讲解“SpringBoot怎么自定义Redis实现缓存序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习springBoot怎么自定义Redis实现缓存序列化”吧!

1、自定义RedisTemplate

1.1、Redis api默认序列化机制

基于API的Redis缓存实现是使用RedisTemplate模板进行数据缓存操作的,这里打开RedisTemplate类,查看该类的源码信息

public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {    // 声明了key、value的各种序列化方式,初始值为空    @Nullable    private RedisSerializer keySerializer = null;    @Nullable    private RedisSerializer valueSerializer = null;    @Nullable    private RedisSerializer hashKeySerializer = null;    @Nullable    private RedisSerializer hashValueSerializer = null;...    // 进行默认序列化方式设置,设置为jdk序列化方式    public void afterPropertiesSet() {        super.afterPropertiesSet();        boolean defaultUsed = false;        if (this.defaultSerializer == null) {            this.defaultSerializer = new JdkSerializationRedisSerializer(                    this.classLoader != null ?                            this.classLoader : this.getClass().getClassLoader());        }        ...    }        ...}

从上述RedisTemplate核心源码可以看出,在RedisTemplate内部声明了缓存数据key、value的各种序列化方式,且初始值都为空;在afterPropertiesSet()方法中,判断如果默认序列化参数defaultSerializer为空,将数据的默认序列化方式设置为JdkSerializationRedisSerializer

根据上述源码信息的分析,可以得到以下两个重要的结论:

(1)使用RedisTemplate进行Redis数据缓存操作时,内部默认使用的是JdkSerializationRedisSerializer序列化方式,所以进行数据缓存的实体类必须实现JDK自带的序列化接口(例如Serializable);

(2)使用RedisTemplate进行Redis数据缓存操作时,如果自定义了缓存序列化方式defaultSerializer,那么将使用自定义的序列化方式。

另外,在RedisTemplate类源码中,看到的缓存数据key、value的各种序列化类型都是RedisSerializer。进入RedisSerializer源码查看RedisSerializer支持的序列化方式(进入该类后,使用Ctrl+Alt+左键单击类名查看)

SpringBoot怎么自定义Redis实现缓存序列化

可以看出,RedisSerializer是一个Redis序列化接口,默认有6个实现类,这6个实现类代表了6种不同的数据序列化方式。其中,JdkSerializationRedisSerializer是JDK自带的,也是RedisTemplate内部默认使用的数据序列化方式,开发者可以根据需要选择其他支持的序列化方式(例如JSON方式)

1.2、自定义RedisTemplate序列化机制

项目中引入Redis依赖后,Spring Boot提供的RedisAutoConfiguration自动配置会生效。打开RedisAutoConfiguration类,查看内部源码中关于RedisTemplate的定义方式

public class RedisAutoConfiguration {    @Bean    @ConditionalOnMissingBean(            name = {"redisTemplate"}    )    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {        RedisTemplate<Object, Object> template = new RedisTemplate();        template.setConnectionFactory(redisConnectionFactory);        return template;    }...}

从上述RedisAutoConfiguration核心源码中可以看出,在Redis自动配置类中,通过Redis连接工厂RedisConnectionFactory初始化了一个RedisTemplate;该类上方添加了@ConditionalOnMissingBean注解(顾名思义,当某个Bean不存在时生效),用来表明如果开发者自定义了一个名为redisTemplate的Bean,则该默认初始化的RedisTemplate不会生效。

如果想要使用自定义序列化方式的RedisTemplate进行数据缓存操作,可以参考上述核心代码创建一个名为redisTemplate的Bean组件,并在该组件中设置对应的序列化方式即可

接下来,在项目中创建名为com.laGou.config的包,在该包下创建一个Redis自定义配置类RedisConfig,并按照上述思路自定义名为redisTemplate的Bean组件

@Configurationpublic class RedisConfig {    // 自定义RedisTemplate    @Bean    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {        RedisTemplate<Object, Object> template = new RedisTemplate<>();        template.setConnectionFactory(redisConnectionFactory);        // 创建一个jsON格式序列化对象,对缓存数据的key和value进行转换        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        // 解决查询缓存转换异常的问题        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        // 设置RedisTemplate模板api序列化方式为json        template.setDefaultSerializer(jackson2JsonRedisSerializer);        return template;    }}

通过@Configuration注解定义了一个RedisConfig配置类,并使用@Bean注解注入了一个默认名称为方法名的redisTemplate组件(注意,该Bean组件名称必须是redisTemplate)。在定义的Bean组件中,自定义了一个RedisTemplate,使用自定义的Jackson2JsonRedisSerializer数据序列化方式;在定制序列化方式中,定义了一个ObjectMapper用于进行数据转换设置

1.3、效果测试

SpringBoot怎么自定义Redis实现缓存序列化

可以看出,执行findById()方法正确查询出用户评论信息Comment,重复进行同样的查询操作,数据库只执行了一次sql语句,这说明定制的Redis缓存生效。

使用Redis客户端可视化管理工具Redis Desktop Manager查看缓存数据 :

SpringBoot怎么自定义Redis实现缓存序列化

执行findById()方法查询出用户评论信息Comment正确存储到了Redis缓存库中,且缓存到Redis服务的数据已经使用了JSON格式存储展示,查看和管理也非常方便,说明自定义的Redis API模板工具RedisTemplate生效

2、自定义RedisCacheManager

刚刚针对基于 API方式的RedisTemplate进行了自定义序列化方式的改进,从而实现了JSON序列化方式缓存数据,但是这种自定义的RedisTemplate对于基于注解的Redis缓存来说,是没有作用的。

接下来,针对基于注解的Redis缓存机制和自定义序列化方式进行讲解

2.1、Redis注解默认序列化机制

打开Spring Boot整合Redis组件提供的缓存自动配置类RedisCacheConfiguration(org.springframework.boot.autoconfigure.cache包下的),查看该类的源码信息,其核心代码如下

@Configurationclass RedisCacheConfiguration {    @Bean    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {        RedisCacheManagerBuilder builder = RedisCacheManager                .builder(redisConnectionFactory)                .cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader()));        List<String> cacheNames = this.cacheProperties.getCacheNames();        if (!cacheNames.isEmpty()) {            builder.initialCacheNames(new LinkedHashSet(cacheNames));        }        return (RedisCacheManager) this.customizerInvoker.customize(builder.build());    }    private org.springframework.data.redis.cache.RedisCacheConfiguration    determineConfiguration(ClassLoader classLoader) {        if (this.redisCacheConfiguration != null) {            return this.redisCacheConfiguration;        } else {            Redis redisProperties = this.cacheProperties.getRedis();            org.springframework.data.redis.cache.RedisCacheConfiguration config = org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig();            config = config.serializeValuesWith(SerializationPair.fromSerializer(                            new JdkSerializationRedisSerializer(classLoader)));            ...            return config;        }    }}

从上述核心源码中可以看出,同RedisTemplate核心源码类似,RedisCacheConfiguration内部同样通过Redis连接工厂RedisConnectionFactory定义了一个缓存管理器RedisCacheManager;同时定制RedisCacheManager时,也默认使用了JdkSerializationRedisSerializer序列化方式。

如果想要使用自定义序列化方式的RedisCacheManager进行数据缓存操作,可以参考上述核心代码创建一个名为cacheManager的Bean组件,并在该组件中设置对应的序列化方式即可

注意,在Spring Boot 2.X版本中,RedisCacheManager是单独进行构建的。因此,在SpringBoot 2.X版本中,对RedisTemplate进行自定义序列化机制构建后,仍然无法对RedisCacheManager内部默认序列化机制进行覆盖(这也就解释了基 于注解的Redis缓存实现仍然会使用JDK默认序列化机制的原因),想要基于注解的Redis缓存实现也使用自定义序列化机制,需要自定义RedisCacheManager

2.2、自定义RedisCacheManager

在项目的Redis配置类RedisConfig中,按照上一步分析的定制方法自定义名为cacheManager的Bean组件

    @Bean    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {        // 分别创建String和JSON格式序列化对象,对缓存数据key和value进行转换        RedisSerializer<String> strSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jacksonSerial = new Jackson2JsonRedisSerializer(Object.class);        // 解决查询缓存转换异常的问题        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); // 上面注释过时代码的替代方法        jacksonSerial.setObjectMapper(om);        // 定制缓存数据序列化方式及时效        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                .entryTtl(Duration.ofDays(1)) // 设置缓存数据的时效(设置为了1天)                .serializeKeysWith(RedisSerializationContext.SerializationPair                        .fromSerializer(strSerializer)) // 对当前对象的key使用strSerializer这个序列化对象,进行转换                .serializeValuesWith(RedisSerializationContext.SerializationPair                        .fromSerializer(jacksonSerial)) // 对value使用jacksonSerial这个序列化对象,进行转换                .disableCachingNullValues();        RedisCacheManager cacheManager = RedisCacheManager                .builder(redisConnectionFactory).cacheDefaults(config).build();        return cacheManager;    }

上述代码中,在RedisConfig配置类中使用@Bean注解注入了一个默认名称为方法名的cacheManager组件。在定义的Bean组件中,通过RedisCacheConfiguration对缓存数据的key和value分别进行了序列化方式的定制,其中缓存数据的key定制为StringRedisSerializer(即String格式),而value定制为了Jackson2JsonRedisSerializer(即JSON格式),同时还使用entryTtl(Duration.ofDays(1))方法将缓存数据有效期设置为1天

完成基于注解的Redis缓存管理器RedisCacheManager定制后,可以对该缓存管理器的效果进行测试(使用自定义序列化机制的RedisCacheManager测试时,实体类可以不用实现序列化接口)

到此,相信大家对“SpringBoot怎么自定义Redis实现缓存序列化”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: SpringBoot怎么自定义Redis实现缓存序列化

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot怎么自定义Redis实现缓存序列化
    本篇内容主要讲解“SpringBoot怎么自定义Redis实现缓存序列化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么自定义Redis实现缓存序列化”吧!1、自定义Red...
    99+
    2023-07-02
  • SpringBoot自定义Redis实现缓存序列化详解
    目录1、自定义RedisTemplate1.1、Redis API默认序列化机制1.2、自定义RedisTemplate序列化机制1.3、效果测试2、自定义RedisCacheMan...
    99+
    2022-11-13
  • SpringBoot 如何实现自定义Redis序列化
    目录问题环境入口点实现自定义序列化小结问题 在使用RedisTemplate存储对象时,如果采用JDK默认的序列化方式,数据会出现许多编码字符,辨析度不高。比如一个空的User对象,...
    99+
    2022-11-12
  • springboot jackson自定义序列化和反序列化实例
    目录jackson自定义序列化和反序列序列化JsonSerializer最后请求http返回对象反序列化JsonDeserializer小结一下springboot 自定义序列化器j...
    99+
    2022-11-12
  • springboot序列化和反序列化怎么定义
    在Spring Boot中,序列化和反序列化可以通过以下方式进行定义:1. 实现Serializable接口:在需要进行序列化和反序...
    99+
    2023-08-14
    springboot
  • SpringBoot集成Redis,并自定义对象序列化操作
    SpringBoot项目使用redis非常简单,pom里面引入redis的场景启动器,在启动类上加@EnableCaching注解,项目启动会自动匹配上redis,这样项目中就可以愉...
    99+
    2022-11-12
  • SpringBoot怎么结合Redis实现序列化
    这篇文章主要介绍了SpringBoot怎么结合Redis实现序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么结合Redis实现序列化文章都会有所收获,下面我们一起来看看吧。配置类配置...
    99+
    2023-07-02
  • 怎么自定义redis缓存拦截器
    自定义Redis缓存拦截器的步骤如下:1. 创建一个实现了`HandlerInterceptor`接口的自定义类,并重写其三个方法`...
    99+
    2023-09-11
    redis
  • redis缓存对象如何实现序列化
    Redis缓存对象的序列化可以使用以下方法实现:1. 使用Redis自带的序列化机制:Redis提供了几种默认的序列化方式,包括ra...
    99+
    2023-09-06
    redis
  • SpringBoot怎么整合Redis实现序列化存储Java对象
    今天小编给大家分享一下SpringBoot怎么整合Redis实现序列化存储Java对象的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-05
  • redisson中怎么实现缓存序列化
    redisson中怎么实现缓存序列化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。redisson缓存序列化几枚坑1、返回值为Map<T, K> 的...
    99+
    2023-06-20
  • Java自定义注解实现Redis自动缓存的方法
    在实际开发中,可能经常会有这样的需要:从MySQL中查询一条数据(比如用户信息),此时需要将用户信息保存至Redis。刚开始我们可能会在查询的业务逻辑之后再写一段Redis相关操作的代码,时间长了后发现这部分代码实际上仅仅做了Redis的写...
    99+
    2023-05-31
    java redis ava
  • redis自增序列怎么实现
    Redis自增序列可以通过以下几种方式实现:1、使用INCR命令:使用Redis的INCR命令可以对一个指定的键进行自增操作。比如,...
    99+
    2023-05-23
    redis自增序列 redis
  • SpringBoot怎么整合Spring Cache实现Redis缓存
    今天小编给大家分享一下SpringBoot怎么整合Spring Cache实现Redis缓存的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2023-07-02
  • GoFrame gredis怎么缓存DoVar Conn连接对象实现自动序列化
    这篇文章主要介绍了GoFrame gredis怎么缓存DoVar Conn连接对象实现自动序列化的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇GoFrame gredis怎么缓存D...
    99+
    2023-07-02
  • SpringBoot怎么整合Redis实现热点数据缓存
    本篇内容主要讲解“SpringBoot怎么整合Redis实现热点数据缓存”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot怎么整合Redis实现热点数据缓存”吧!我们以IDEA ...
    99+
    2023-07-05
  • 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序列化存储
  • kafka序列化器和拦截器怎么自定义使用
    本篇内容主要讲解“kafka序列化器和拦截器怎么自定义使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“kafka序列化器和拦截器怎么自定义使用”吧!介绍序列化器是和数据在网络中的传输有关,数据...
    99+
    2023-07-05
  • SpringBoot怎么整合Redis实现高并发数据缓存
    这篇文章主要讲解了“SpringBoot怎么整合Redis实现高并发数据缓存”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么整合Redis实现高并发数据缓存”吧!什么是...
    99+
    2023-07-05
  • Redis+AOP怎么自定义注解实现限流
    今天小编给大家分享一下Redis+AOP怎么自定义注解实现限流的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。下载1,下载页面...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作