为什么用户需要自己创建一个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序列化工具相关推荐

  1. Spring Session Redis——自定义JSON序列化解决方案

    问题描述 Spring Session + Redis--自定义JSON序列化解决方案 问题分析 RedisHttpSessionConfiguration中,Bean名称必须是springSessi ...

  2. Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑

    前言 上一篇已经介绍了优雅的操作Redis: [小家Spring]Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题.本篇着重 ...

  3. 自定义redisTemplate序列化配置

    使用spring-boot-starter-data-redis来操作redis时,自定义RedisTemplate类. package com.hmdp.config;import com.fast ...

  4. Redis序列化配置类

    1.工具类:Redis序列化配置的一个类 package com.example.demo.config;import com.fasterxml.jackson.annotation.JsonAut ...

  5. java redis remove_最全的Java操作Redis的工具类

    RedisUtil 当前版本:1.1 增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本. 介绍 最全的Java操作Redis的工具类,使用StringRedisTemplate实现, ...

  6. redis序列化_SpringBoot整合redis

    redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度 ...

  7. flink sql 知其所以然(二)| 自定义 redis 数据维表(附源码)

    感谢您的关注  +  点赞 + 再看,对博主的肯定,会督促博主持续的输出更多的优质实战内容!!! 1.序篇-本文结构 背景篇-为啥需要 redis 维表 目标篇-做 redis 维表的预期效果是什么 ...

  8. Redis序列化的几种方式

    Redis序列化的几种方式 1.什么是Redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis ...

  9. Redis 序列化方式StringRedisSerializer、FastJsonRedisSerializer和KryoRedisSerializer

    当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的.RedisTemplate默认使用的是JdkSerializat ...

最新文章

  1. 五种常见的PHP设计模式
  2. keepalived + glusterfs实现高可用
  3. python之路目录
  4. 三层架构用户登录代码c语言,网站用户登录、注册和修改密码常用代码,采用三层架构...
  5. pr_debug、dev_dbg等动态调试三
  6. 如何将Outgoing Webhook部署到中国版Azure
  7. android与js交互
  8. Strust2的sx:datetimepicker限制日期选择
  9. 传递HTML字符串virtual,理解Virtual DOM(1) 真实DOM和虚拟DOM的映射
  10. sql自动审核工具-inception
  11. linux sshd自动登录,SSH自动登录的几种方法
  12. win8计算机触摸板怎么设置,win8.1笔记本电脑怎么关闭键盘触摸板
  13. 双路服务器单路运行,什么叫双路服务器?与PC机、单路机有什么区别?
  14. C51- NRF24L01 无线串口模块
  15. 热启动计算机的快捷键,电脑怎么设置U盘启动 各品牌电脑热启动快捷键大全-电脑教程...
  16. ado.net访问ORACLE数据库点滴
  17. c语言输出法雷序列,法雷(法里)序列 - osc_h0wb1wlt的个人空间 - OSCHINA - 中文开源技术交流社区...
  18. SQLyog 试用期过的解决办法
  19. 同样是IT行业,测试和开发薪资真有这么大差别?
  20. com.google.guava maven依赖

热门文章

  1. Google Wave了解(资料收集)
  2. firefox 复制文本js代码。判断窗口是关闭还是刷新
  3. ObjectDataSource未能找到带参数的非泛型方法
  4. measure,layout,draw的相关方法
  5. WebKit DOM Event (一)
  6. Chrome Native Client 原理
  7. Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)
  8. startActivity( ) 与startActivityForResult( )的区别
  9. (一)docker run 命令参数
  10. kotlin学习笔记——接口与委托