首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >RedisTemplate和StringRedisTemplate的区别及个人见解

RedisTemplate和StringRedisTemplate的区别及个人见解

原创
作者头像
刘大猫
发布2025-11-11 21:30:49
发布2025-11-11 21:30:49
1460
举报
文章被收录于专栏:JAVA相关JAVA相关

@toc

一、区别

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

二、问题总结

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

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

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

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

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

代码语言: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的序列化

StringRedisTemplate的序列化

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

代码语言:java
复制
@Test
public void redisTemplateAndStringRedisTemplate1() {
    redisTemplate.opsForValue().set("redisTemplateListKey","abc");
    stringRedisTemplate.opsForValue().set("stringRedisTemplateListKey","def");
}

结果如下:

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

stringRedisTemplate

RedisTemplate

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

<font color='red'>答案:</font>区别在于RedisTemplate存入redis的字符串有双引号,而StringRedisTemplate存入redis的字符串居然没有双引号。

代码如下:

代码语言:java
复制
@Test
public void redisTemplateAndStringRedisTemplate1() {
    redisTemplate.opsForValue().set("redisTemplateListKey","abc");
    stringRedisTemplate.opsForValue().set("stringRedisTemplateListKey","def");
}

结果展示如下: RedisTemplate

StringRedisTemplate

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

源码分析:

<font color='red'>先看 StringRedisTemplate:</font>

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

这下就一目了然了!

<font color='red'>再看 RedisTemplate:</font>

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

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

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

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

<font color='red'>答案:4种:字符串序列化、json序列化、jdk序列化

JdkSerializationRedisSerializer、StringRedisSerializer、GenericJackson2JsonRedisSerializer、GenericFastJsonRedisSerializer。</font>

其中:StringRedisSerializer =》 字符串序列化

JdkSerializationRedisSerializer =》 jdk序列化

GenericJackson2JsonRedisSerializer和GenericFastJsonRedisSerializer =》 json序列化

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、区别
  • 二、问题总结
    • 问题1:究竟是数据隔离?还是存入的数据访问不到?用词是否严谨?
    • 问题2:(重要)我自己测试RedisTemplate和StringRedisTemplate居然都可以彼此访问到存取的字符串值,为啥?别人文章说数据不共通
    • 问题3:.源码分析RedisTemplate和StringRedisTemplate的序列化方式
    • 问题4:.RedisTemplate和StringRedisTemplate使用默认序列化方式存值区别在哪?仍然使用如下代码,只不过自己不设置序列化使用默认值
    • 问题5:.RedisTemplate和StringRedisTemplate存入redis的字符串类型不一致?
    • 问题6:两者的关系是StringRedisTemplate继承RedisTemplate。RedisTemplate是一个泛型类,而StringRedisTemplate则不是。
    • 问题7:为啥RedisTemplate 需要自定义序列化?
    • 问题8:对redis的value使用序列化方式有几种?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档