叙述

RedisTemplate中的几个角色:

  1. RedisSerializer:由于与Redis服务器的通信一定是使用字节数组完成的,所以RedisSerializer是将Java对象编码解码的组件
  2. RedisOperations:封装了一些Redis操作
  3. 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相关推荐

  1. Redis - RedisTemplate及4种序列化方式深入解读

    文章目录 概述 RedisTemplate StringRedisTemplate RedisSerializer 序列化 接口 JDK 序列化方式 (默认) String 序列化方式 JSON 序列 ...

  2. redistemplate set方法_spring boot整合redis ---- RedisTemplate 三分钟快速入门

    引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spri ...

  3. php redis 删除元素,redisTemplate.delete()不能删除元素

    最近在学习redis,使用spring-data-redis的RedisTemplate.delete()方法删除时,添加是成功的,但是不能删除. 代码如下 public abstract class ...

  4. 深入理解 Redis Template及4种序列化方式__spring boot整合redis实现RedisTemplate三分钟快速入门

    概述 使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板类 RedisTemplate, 今天我们好好的看看这个模板类 . RedisTem ...

  5. Spring Boot集成Redis缓存之RedisTemplate的方式

    前言 Spring Boot 集成Redis,将自动配置 RedisTemplate,在需要使用的类中注入RedisTemplate的bean即可使用 @Autowired private Redis ...

  6. Redis的Java客户端——SpringDataRedis、RedisTemplate、StringRedisTemplate

    目录 一.初步了解SpringDataRedis 1.1 特点: 二.快速入门SpringDataRedis 2.1  引入依赖 2.2 配置文件 2.3 注入RedisTemplate 2.4 编写 ...

  7. redis 使用redisTemplate使用PipeLine方式 利用lRange 批量获取队列内容并移除当前获取的消息

    Redis基础配置 配置解析方式,泛型类自动转换更加方便 private RedisTemplate redisTemplate;private RedisSerializer<String&g ...

  8. 高并发下redis缓存穿透问题解决方案

    一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...

  9. springmvc整合redis架构搭建实例

    新换环境,又有新东西可以学习了,哈皮! 抽空学习之余看了一下redis,个人对Springmvc的爱是忠贞不渝,所以整理了一下Springmvc整合redis的环境搭建.分享学习. 第一步 : 创建  ...

最新文章

  1. linux printk 时间戳,linux – kern.log中“00:00:00”时间戳的含义是什么?
  2. 元组tuple类型内置方法
  3. java 环境变量的涵义
  4. mapxtreme开发资料全集
  5. 利用JavaScript在ASP.NET中动态生成系统菜单
  6. sql注入问题-视图-事物-以及存储过程(可视化工具)
  7. 百练2810:完美立方
  8. 用JavaScript实现一个Timeline
  9. Vue 实现图片在循环中 默认 和 选中 之间的点击切换
  10. phantomjs php 登录,PHANTOMJS PHP:空响应对象
  11. 唠唠SE的IO-03——字符输入输出流
  12. 计算机java二级_关于Java计算机二级考试内容。
  13. Deep Adversarial Decomposition: A Unified Framework for Separating Superimposed Images
  14. MPB:遗传发育所白洋组-​高通量分离培养和鉴定植物根系细菌
  15. 嵌入式音视频解决方案 Webrtc vs MetaRTC
  16. Java Swing实现高仿电脑版微信
  17. 估值篇之最关键指标ROE
  18. 腾讯云免费服务器 如何领取?
  19. 用python判断身份证号性别_验证身份证号的Python脚本
  20. ERROR 429: Too Many Requests.

热门文章

  1. vue和google翻译助手的冲突问题
  2. led灯模组是什么东西_【轻工标准抢先知】LED灯、LED灯具和LED模组的测试方法
  3. NVIDIA GTC主题演讲内容学习<1>
  4. navicat查看一张表显示正在加载中
  5. 谭浩强C语言第七章知识总结
  6. python37-32_讨论 - 廖雪峰的官方网站
  7. java 手电筒 电池_android 手电筒app完整源码下载(支持切换背景图)
  8. 金山公司推出全新的金山毒霸体验版
  9. 前端基础查漏补缺知识
  10. C# 调用outlook发送邮件