RedisTemplate和StringRedisTemplate的区别及个人见解

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: RedisTemplate和StringRedisTemplate的区别及个人见解

image.png
@[toc]

一、区别

  1. 区别点1:两者的关系是StringRedisTemplate继承RedisTemplate。RedisTemplate是一个泛型类,而StringRedisTemplate则不是。
  2. 区别点2:两者序列化策略不同,
    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
  3. 区别点3:(疑惑点)两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
  4. 区别点4:StringRedisTemplate只能对key=String,value=String的键值对进行操作,RedisTemplate可以对任何类型的key-value键值对操作。

二、问题总结

问题1:究竟是数据隔离?还是存入的数据访问不到?用词是否严谨?

答案:严谨说并不是数据隔离,而应该说成是彼此存入redis的数据存在,但是访问不到;而数据隔离通常指的是数据存在同一个库下,但是自己只能查看并访问自己的数据,而redis中数据都能看到且只是使用不同RedisTemplate和StringRedisTemplate对象彼此访问不到而已。

## 问题2:(重要)我自己测试RedisTemplate和StringRedisTemplate居然都可以彼此访问到存取的字符串值,为啥?别人文章说数据不共通

答案:所谓的彼此访问不到数据,前提是自己不重新对RedisTemplate进行序列化设置, 大白话讲就是直接使用默认的,这样才能实现彼此数据隔离访问不到,而实现了序列化后RedisTemplate和StringRedisTemplate对字符串类型数据就都能获取了。

而我的能访问到就是我对RedisTemplate进行了序列化设置,比如如下代码, 注意这一行: template.setKeySerializer(RedisSerializer.string());这样设置后就 会导致RedisTemplate和StringRedisTemplate针对string类型的属性值使用了相同的序列化方式,这样就能彼此访问到数据了;反之不设置这一行,就会彼此反问不到数据。

java package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; @Configuration public class RedisConfig { @Bean(name = "redisTemplate") public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, String> template = new RedisTemplate<>(); template.setConnectionFactory(factory); //key的序列化采用String类型的 template.setKeySerializer(RedisSerializer.string()); //value的序列化采用jackson类型 template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); //hash的key的序列化也采用String类型 template.setHashKeySerializer(RedisSerializer.string()); //value的序列化采用jackson类型 template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } }
## 问题3:.源码分析RedisTemplate和StringRedisTemplate的序列化方式

> RedisTemplate的序列化

image.png
image.png


> StringRedisTemplate的序列化

image.png

## 问题4:.RedisTemplate和StringRedisTemplate使用默认序列化方式存值区别在哪?仍然使用如下代码,只不过自己不设置序列化使用默认值

java @Test public void redisTemplateAndStringRedisTemplate1() { redisTemplate.opsForValue().set("redisTemplateListKey","abc"); stringRedisTemplate.opsForValue().set("stringRedisTemplateListKey","def"); }

> 结果如下:

可以发现stringRedisTemplate存入的还是字符串样式,能直接看出属性值为def, 然而RedisTemplate存入的key值前面居然多加了一串16进制的字符串值,同时存入redis的结果也是转换为字节数组bytes之后的看不懂的值

> stringRedisTemplate

image.png


> RedisTemplate

image.png



## 问题5:.RedisTemplate和StringRedisTemplate存入redis的字符串类型不一致?

答案:区别在于RedisTemplate存入redis的字符串有双引号,而StringRedisTemplate存入redis的字符串居然没有双引号。

> 代码如下:

java @Test public void redisTemplateAndStringRedisTemplate1() { redisTemplate.opsForValue().set("redisTemplateListKey","abc"); stringRedisTemplate.opsForValue().set("stringRedisTemplateListKey","def"); }

> 结果展示如下: RedisTemplate

image.png


> StringRedisTemplate

image.png

## 问题6:两者的关系是StringRedisTemplate继承RedisTemplate。RedisTemplate是一个泛型类,而StringRedisTemplate则不是。

> 源码分析:

先看 StringRedisTemplate:

StringRedisTemplate 是继承 RedisTemplate的,一般来说子类继承父类,应该能实现更多的功能,但是此处我们发现 StringRedisTemplate 继承的是 RedisTemplate的泛型类,指定了String-String的泛型!故功能只专注于String类型!
image.png

这下就一目了然了!

再看 RedisTemplate:
image.png

问题7:为啥RedisTemplate 需要自定义序列化?

答案:RedisTemplate 可以接收任意的 Object 作为值写入 Redis,只不过写入前会把 Object 序列化为字节形式,默认采用 JDK 序列化。但是这种方式有两个缺点:

  • 可读性差。对键值对进行了序列化,中文字符串序列化后的内容表示为 16 进制表示的数据,可读性差。
  • 内存空间占用大。存储了额外的对象的类型信息,占用了内存空间。
    因此,RedisTemplate 需要自定义序列化方式

问题8:对redis的value使用序列化方式有几种?

答案:4种:字符串序列化、json序列化、jdk序列化
JdkSerializationRedisSerializer、StringRedisSerializer、GenericJackson2JsonRedisSerializer、GenericFastJsonRedisSerializer。

其中:StringRedisSerializer =》 字符串序列化
JdkSerializationRedisSerializer =》 jdk序列化
GenericJackson2JsonRedisSerializer和GenericFastJsonRedisSerializer =》 json序列化

目录
相关文章
|
Arthas 监控 Java
开源Java诊断工具Arthas:开篇之watch实战
还在为排查Java程序线上问题头痛吗,看我们用阿里开源的诊断神器 Arthas 来帮您
1041 1
|
2月前
|
人工智能 网络协议 NoSQL
在性能优化时,如何避免盲人摸象
盲人摸象最早出自于《大般涅槃经》,讲述一群盲人触摸大象的不同部位,由于每人触及部位不同,却各自认为自己摸到的才是大象的全部,并为此争吵。比喻对事物了解不全面,以偏概全。
319 28
在性能优化时,如何避免盲人摸象
|
Java Apache Scala
【阿里云镜像】配置阿里云Maven 镜像
【阿里云镜像】配置阿里云Maven 镜像
25620 1
【阿里云镜像】配置阿里云Maven 镜像
|
9月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
516 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
7月前
|
Java Linux
java的jar后台启动
java的jar后台启动
187 14
|
2月前
|
数据采集 人工智能 编解码
AI出码率70%+的背后:高德团队如何实现AI研发效率的量化与优化
本文系统阐述了在AI辅助编程快速发展的背景下,如何构建一套科学、可落地的研发效率量化指标体系
725 27
AI出码率70%+的背后:高德团队如何实现AI研发效率的量化与优化
|
21天前
|
人工智能 安全 程序员
AI会写代码,但谁来定义问题?
在AI编码时代,技术债务问题被急剧放大。AI既能放大编码能力,也会放大错误和模糊需求带来的问题。本文探讨了需求分析在AI时代的关键作用,提出了有效路径,强调需求分析师将成为AI时代最重要的角色,并确保软件系统真正解决业务问题。
179 98
|
21天前
|
架构师 Java 程序员
程序员的出路:30岁,我们聊聊那些真实的选择
30岁程序员的迷茫与出路:技术焦虑、薪资倒挂、能力单一困扰着许多人。本文基于真实观察,梳理五条可行路径——深耕技术、理性转管理、务实搞副业、跨界融合、提前布局B计划,并总结三条铁律与自测问题,帮助你在变局中找到方向。出路不在远方,而在你写下的每一行“值钱”的代码里。(238字)
318 117
|
1月前
|
分布式计算 监控 API
DMS Airflow:企业级数据工作流编排平台的专业实践
DMS Airflow 是基于 Apache Airflow 构建的企业级数据工作流编排平台,通过深度集成阿里云 DMS(Data Management Service)系统的各项能力,为数据团队提供了强大的工作流调度、监控和管理能力。本文将从 Airflow 的高级编排能力、DMS 集成的特殊能力,以及 DMS Airflow 的使用示例三个方面,全面介绍 DMS Airflow 的技术架构与实践应用。
|
2月前
|
人工智能 监控 安全
让Agent系统更聪明之前,先让它能被信任
当我们将所有希望寄托于大模型的「智能」时,却忘记了智能的不确定性必须以工程的确定性为支撑。一个无法复现、无法调试、无法观测的智能,更像是一场精彩但失控的魔法,而非我们真正需要的、可靠的生产力。本文尝试从系统工程的视角剖析 Agent 系统在可运行、可复现与可进化三个层次上不断升级的问题以及复杂度。进一步认识到:框架/平台让 Agent 「好搭」但没有让它「好用」,真正的复杂性,从未被消除,只是被推迟。
359 33
让Agent系统更聪明之前,先让它能被信任