RedisTemplate 以及 RedisSerializer
叙述
RedisTemplate
中的几个角色:
RedisSerializer
:由于与Redis服务器的通信一定是使用字节数组完成的,所以RedisSerializer
是将Java对象编码解码的组件RedisOperations
:封装了一些Redis操作XXXOperations
:封装了指定类型或功能的数据的操作,如ZSetOperations
RedisSerializer
RedisSerializer
提供了两个方法,一个用于序列化,一个用于反序列化。并且,它提供了一个泛型T,代表该序列化器处理的类型。
public interface RedisSerializer<T> {@Nullablebyte[] serialize(@Nullable T t) throws SerializationException;@NullableT deserialize(@Nullable byte[] bytes) throws SerializationException;}
它的实现类有下面这些:
从实现类的名字可以看出,其中有将对象转换为json的,有使用JDK自带的序列化机制进行序列化反序列化的,有专门处理String的...
默认情况下,RedisTemplate使用JdkSerializationRedisSerializer
,也就是JDK默认的序列化机制来进行序列化。
默认序列化器#
RedisTemplate的成员属性中有如下和序列化器相关的属性:
// 是否启用默认序列化器
private boolean enableDefaultSerializer = true;
// 默认序列化器
private @Nullable RedisSerializer<?> defaultSerializer;// 键的序列化器
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer keySerializer = null;
// 值序列化器
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null;
// hash键序列化器
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null;
// hash值序列化器
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null;
// 字符串序列化器,使用StringRedisSerializer
private RedisSerializer<String> stringSerializer = RedisSerializer.string();
从这里我们可以看出,我们可以对RedisTemplate进行设置,在不同的情况下使用不同的序列化器,如在hash值的序列化上使用Jdk序列化器,而在普通的值上使用字符串序列化器。
RedisTemplate
继承了InitailizingBean
,所以,在Bean的初始化阶段结束后,它的afterPropertiesSet
方法被调用并执行了以下代码:
@Override
public void afterPropertiesSet() {super.afterPropertiesSet();boolean defaultUsed = false;// 如果默认初始化器为空,创建JdkSerializationRedisSerializerif (defaultSerializer == null) {defaultSerializer = new JdkSerializationRedisSerializer(classLoader != null ? classLoader : this.getClass().getClassLoader());}// 如果 enableDefaultSerializer = true// 将key/value/hashkey和hashvalue的序列化器都设置成默认序列化器if (enableDefaultSerializer) {if (keySerializer == null) {keySerializer = defaultSerializer;defaultUsed = true;}if (valueSerializer == null) {valueSerializer = defaultSerializer;defaultUsed = true;}if (hashKeySerializer == null) {hashKeySerializer = defaultSerializer;defaultUsed = true;}if (hashValueSerializer == null) {hashValueSerializer = defaultSerializer;defaultUsed = true;}}if (enableDefaultSerializer && defaultUsed) {Assert.notNull(defaultSerializer, "default serializer null and not all serializers initialized");}if (scriptExecutor == null) {this.scriptExecutor = new DefaultScriptExecutor<>(this);}initialized = true;
}
所以默认情况下,所有的(除了那个stringSerializer
之外)操作都将使用Jdk自带的序列化和反序列化来对对象进行编解码,这要求你传入到Redis中的对象必须实现了Serializable
接口。
下面是默认情况下的一个示例:
@SpringBootTest
public class RedisTemplateTest {@Autowiredprivate RedisTemplate redisTemplate;@Testvoid test() {redisTemplate.opsForValue().set("key", "value");}}
去Redis中查询,出现了莫名其妙的前缀,这是Java序列化机制添加的。
序列化器的设置
在下面的例子中,我们将默认序列化器设置成了StringRedisSerializer,所以,在我们插入字符串时,它会按照字符串的方式编码
@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory factory) {RedisTemplate redisTemplate = new RedisTemplate();redisTemplate.setConnectionFactory(factory);redisTemplate.setDefaultSerializer(new StringRedisSerializer());return redisTemplate;}
}
再次运行之前的测试用例,redis中出现了这个结果:
StringRedisSerializer
只支持字符串类型的转化,而且默认使用UTF-8编码,所以现在,如果你使用非String的对象,应该会出错
@Test
void testObject() {Student student = new Student();redisTemplate.opsForValue().set("student", student);
}
而在使用最初的Jdk序列化器时,则不会出现这个错误,下面,我们将键的序列化器设置成String的,将值的设置成Jdk序列化器,这样,我们可以保证在key上不会出现那些奇奇怪怪的前缀字符,而且可以将值设置成对象
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {RedisTemplate redisTemplate = new RedisTemplate();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());// 默认情况下不设置也是这个redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());return redisTemplate;
}
RedisTemplate 以及 RedisSerializer相关推荐
- Redis - RedisTemplate及4种序列化方式深入解读
文章目录 概述 RedisTemplate StringRedisTemplate RedisSerializer 序列化 接口 JDK 序列化方式 (默认) String 序列化方式 JSON 序列 ...
- redistemplate set方法_spring boot整合redis ---- RedisTemplate 三分钟快速入门
引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spri ...
- php redis 删除元素,redisTemplate.delete()不能删除元素
最近在学习redis,使用spring-data-redis的RedisTemplate.delete()方法删除时,添加是成功的,但是不能删除. 代码如下 public abstract class ...
- 深入理解 Redis Template及4种序列化方式__spring boot整合redis实现RedisTemplate三分钟快速入门
概述 使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板类 RedisTemplate, 今天我们好好的看看这个模板类 . RedisTem ...
- Spring Boot集成Redis缓存之RedisTemplate的方式
前言 Spring Boot 集成Redis,将自动配置 RedisTemplate,在需要使用的类中注入RedisTemplate的bean即可使用 @Autowired private Redis ...
- Redis的Java客户端——SpringDataRedis、RedisTemplate、StringRedisTemplate
目录 一.初步了解SpringDataRedis 1.1 特点: 二.快速入门SpringDataRedis 2.1 引入依赖 2.2 配置文件 2.3 注入RedisTemplate 2.4 编写 ...
- redis 使用redisTemplate使用PipeLine方式 利用lRange 批量获取队列内容并移除当前获取的消息
Redis基础配置 配置解析方式,泛型类自动转换更加方便 private RedisTemplate redisTemplate;private RedisSerializer<String&g ...
- 高并发下redis缓存穿透问题解决方案
一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...
- springmvc整合redis架构搭建实例
新换环境,又有新东西可以学习了,哈皮! 抽空学习之余看了一下redis,个人对Springmvc的爱是忠贞不渝,所以整理了一下Springmvc整合redis的环境搭建.分享学习. 第一步 : 创建 ...
最新文章
- linux printk 时间戳,linux – kern.log中“00:00:00”时间戳的含义是什么?
- 元组tuple类型内置方法
- java 环境变量的涵义
- mapxtreme开发资料全集
- 利用JavaScript在ASP.NET中动态生成系统菜单
- sql注入问题-视图-事物-以及存储过程(可视化工具)
- 百练2810:完美立方
- 用JavaScript实现一个Timeline
- Vue 实现图片在循环中 默认 和 选中 之间的点击切换
- phantomjs php 登录,PHANTOMJS PHP:空响应对象
- 唠唠SE的IO-03——字符输入输出流
- 计算机java二级_关于Java计算机二级考试内容。
- Deep Adversarial Decomposition: A Unified Framework for Separating Superimposed Images
- MPB:遗传发育所白洋组-​高通量分离培养和鉴定植物根系细菌
- 嵌入式音视频解决方案 Webrtc vs MetaRTC
- Java Swing实现高仿电脑版微信
- 估值篇之最关键指标ROE
- 腾讯云免费服务器 如何领取?
- 用python判断身份证号性别_验证身份证号的Python脚本
- ERROR 429: Too Many Requests.