自定义Redis序列化工具
为什么用户需要自己创建一个redis配置类?
SpringBoot提供了对Redis的自动配置功能,在RedisAutoConfiguration类中默认为我们配置了客户端连接(Lettuce和Jedis),以及数据操作模板(StringRedisTemplate和RedisTemplate),下列代码有一个@ConditionalOnMissingBean和@Bean的注解,@ConditionalOnMissingBean注解判断是否执行初始化代码,即如果用户已经创建了bean,则相关的初始化代码不再执行。这导致了默认的是redisTemplate方法会被执行。
RedisTemplate是Spring提供用于操作redis数据库的一个类。将数据存放到Redis中,以及数据读取。这里必然涉及到数据的序列化和反序列化。RedisTemplate默认的系列化类是JdkSerializationRedisSerializer,用JdkSerializationRedisSerializer序列化的话,被序列化的对象必须实现Serializable接口。在存储内容时,除了属性的内容外还存了其它内容在里面,总长度长,且不容易阅读。所以才需要创建一个redis的配置类覆盖默认的序列化。我们要求是存储的数据可以方便查看,也方便反系列化,方便读取数据。
spring为我们提供了多种序列化方式,都在org.springframework.data.redis.serializer包下,常用的分别是:
- JdkSerializationRedisSerializer
- GenericJackson2JsonRedisSerializer
- StringRedisSerializer
- Jackson2JsonRedisSerializer
JacksonJsonRedisSerializer是spring提供的序列化工具,GenericJackson2JsonRedisSerializer是fastjson提供的json序列化工具,两者都能把字符串序列化成json,但是后者会在json中加入 @class属性,类的全路径包名,方便反系列化。前者如果存放了List则在反系列化的时候如果没指定TypeReference则会报错java.util.LinkedHashMap cannot be cast to 。
两者的具体区别如下:JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer的区别
通过RedisSerializer接口实现自定义的redis的序列化工具
Springboot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多nosql数据库一样提供了自动化配置的支持,包括:redis、MongoDB、elasticsearch、solr和Cassandra。
1、springboot对Redis的支持和使用
Spring Boot提供的数据访问框架Spring Data Redis基于Jedis。可以通过如下方式来配制maven依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
可以在application.properties中加入Redis服务端的相关配置,也可以使用springboot的方式直接在application.yml文件中进行配置,本文采用在.yml文件中配置的方式实现:
以下是一个redis配置工具类实例,该实例中使用StringRedisSerializer设置key的序列化方式为字符串方式,使用自定义redis序列化类 FastJsonRedisSerializer设置value的序列化方式为json方式。
2、自定义redis序列化类:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.nio.charset.Charset;/*** 自定义redis序列化类FastJsonRedisSerializer* @author: liumengbing* @date: 2019/05/28 10:52**/
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");private Class<T> clazz;public FastJsonRedisSerializer(Class<T> clazz) {super();this.clazz = clazz;}@Overridepublic byte[] serialize(T t) throws SerializationException {if(t == null){return new byte[0];}return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);}@Overridepublic T deserialize(byte[] bytes) throws SerializationException {if(bytes == null || bytes.length < 0){return null;}String string = new String(bytes,DEFAULT_CHARSET);return JSON.parseObject(string,clazz);}
}
3、Redis配置工具类:
package com.example.springboottest;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** redis配置工具类* @author: liumengbing* @date: 2019/04/11 10:53**/
@Configuration
public class RedisConfig {@Value("${spring.redis.host}")String rhost;@Value("${spring.redis.port}")Integer rport;@Value("${spring.redis.database}")Integer rdatabase;@Value("${spring.redis.password}")String rpassword;@Bean@Primarypublic JedisConnectionFactory jedisConnectionFactory(){RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(rhost, rport);redisStandaloneConfiguration.setDatabase(rdatabase);redisStandaloneConfiguration.setPassword(RedisPassword.of(rpassword));JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration);jedisConnectionFactory.afterPropertiesSet();return jedisConnectionFactory;}@Bean@Primarypublic RedisTemplate redisTemplate(@Qualifier("jedisConnectionFactory")JedisConnectionFactory jedisConnectionFactory){RedisTemplate redisTemplate = new RedisTemplate();StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();//设置序列化Key的实例化对象,Key的序列化始终是字符串方式redisTemplate.setKeySerializer(stringRedisSerializer);redisTemplate.setHashKeySerializer(stringRedisSerializer);FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);//设置序列化Value的实例化对象redisTemplate.setValueSerializer(fastJsonRedisSerializer);redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);redisTemplate.setConnectionFactory(jedisConnectionFactory);redisTemplate.afterPropertiesSet();return redisTemplate;}
}
引申:
为什么Spring redis中缓存的对象需要实现 Serializable 序列化接口
使用Spring Data Redis时,遇到的几个问题
自定义Redis序列化工具相关推荐
- Spring Session Redis——自定义JSON序列化解决方案
问题描述 Spring Session + Redis--自定义JSON序列化解决方案 问题分析 RedisHttpSessionConfiguration中,Bean名称必须是springSessi ...
- Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
前言 上一篇已经介绍了优雅的操作Redis: [小家Spring]Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题.本篇着重 ...
- 自定义redisTemplate序列化配置
使用spring-boot-starter-data-redis来操作redis时,自定义RedisTemplate类. package com.hmdp.config;import com.fast ...
- Redis序列化配置类
1.工具类:Redis序列化配置的一个类 package com.example.demo.config;import com.fasterxml.jackson.annotation.JsonAut ...
- java redis remove_最全的Java操作Redis的工具类
RedisUtil 当前版本:1.1 增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本. 介绍 最全的Java操作Redis的工具类,使用StringRedisTemplate实现, ...
- redis序列化_SpringBoot整合redis
redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度 ...
- flink sql 知其所以然(二)| 自定义 redis 数据维表(附源码)
感谢您的关注 + 点赞 + 再看,对博主的肯定,会督促博主持续的输出更多的优质实战内容!!! 1.序篇-本文结构 背景篇-为啥需要 redis 维表 目标篇-做 redis 维表的预期效果是什么 ...
- Redis序列化的几种方式
Redis序列化的几种方式 1.什么是Redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis ...
- Redis 序列化方式StringRedisSerializer、FastJsonRedisSerializer和KryoRedisSerializer
当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的.RedisTemplate默认使用的是JdkSerializat ...
最新文章
- 五种常见的PHP设计模式
- keepalived + glusterfs实现高可用
- python之路目录
- 三层架构用户登录代码c语言,网站用户登录、注册和修改密码常用代码,采用三层架构...
- pr_debug、dev_dbg等动态调试三
- 如何将Outgoing Webhook部署到中国版Azure
- android与js交互
- Strust2的sx:datetimepicker限制日期选择
- 传递HTML字符串virtual,理解Virtual DOM(1) 真实DOM和虚拟DOM的映射
- sql自动审核工具-inception
- linux sshd自动登录,SSH自动登录的几种方法
- win8计算机触摸板怎么设置,win8.1笔记本电脑怎么关闭键盘触摸板
- 双路服务器单路运行,什么叫双路服务器?与PC机、单路机有什么区别?
- C51- NRF24L01 无线串口模块
- 热启动计算机的快捷键,电脑怎么设置U盘启动 各品牌电脑热启动快捷键大全-电脑教程...
- ado.net访问ORACLE数据库点滴
- c语言输出法雷序列,法雷(法里)序列 - osc_h0wb1wlt的个人空间 - OSCHINA - 中文开源技术交流社区...
- SQLyog 试用期过的解决办法
- 同样是IT行业,测试和开发薪资真有这么大差别?
- com.google.guava maven依赖
热门文章
- Google Wave了解(资料收集)
- firefox 复制文本js代码。判断窗口是关闭还是刷新
- ObjectDataSource未能找到带参数的非泛型方法
- measure,layout,draw的相关方法
- WebKit DOM Event (一)
- Chrome Native Client 原理
- Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)
- startActivity( ) 与startActivityForResult( )的区别
- (一)docker run 命令参数
- kotlin学习笔记——接口与委托