RedisTemplate和StringRedisTemplate的区别

2023-11-07

RedisTemplate和StringRedisTemplate的区别:

1. 两者的关系是StringRedisTemplate继承RedisTemplate。

2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

3. SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面

当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这都是根据序列化策略来决定的。

而stringredistemplate,默认存入的数据就是原文,因为stringRedistemplate默认使用的是string序列化策略,使用stringredistemplate默认存入数据长这个样:

注:使用的软件是RedisDesktopManager

造成两者差异的原因是因为在初始化时,两者使用的序列化策略不同导致的,翻开源码可以看到,如下:

public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
    private boolean enableTransactionSupport = false;
    private boolean exposeConnection = false;
    private boolean initialized = false;
    private boolean enableDefaultSerializer = true;
    @Nullable
    private RedisSerializer<?> defaultSerializer;
    @Nullable
    private RedisSerializer keySerializer = null;
    @Nullable
    private RedisSerializer valueSerializer = null;
    @Nullable
    private RedisSerializer hashKeySerializer = null;
    @Nullable
    private RedisSerializer hashValueSerializer = null;
    // 其它字段略...

    public RedisTemplate() {
    }


    // 该方法是重写RedisAccessor的方法 RedisAccessor实现了spring的InitializingBean 也就是在启动时会执行该方法 可以看到该方法默认的序列化为JdkSerializationRedisSerializer
    public void afterPropertiesSet() {
        super.afterPropertiesSet();
        boolean defaultUsed = false;
        if (this.defaultSerializer == null) {
            this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
        }

        if (this.enableDefaultSerializer) {
            if (this.keySerializer == null) {
                this.keySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.valueSerializer == null) {
                this.valueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashKeySerializer == null) {
                this.hashKeySerializer = this.defaultSerializer;
                defaultUsed = true;
            }

            if (this.hashValueSerializer == null) {
                this.hashValueSerializer = this.defaultSerializer;
                defaultUsed = true;
            }
        }

        if (this.enableDefaultSerializer && defaultUsed) {
            Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
        }

        if (this.scriptExecutor == null) {
            this.scriptExecutor = new DefaultScriptExecutor(this);
        }

        this.initialized = true;
    }
    // 其余方法略...
}

可以看到redistemplate在初始化时是无参构造,通过spring的bean加载机制在项目启动时执行afterPropertiesSet来完成序列化设置,如果需要自定义序列化配置,可以自己写一个redistemplate的bean,来完成配置。

stringredistemplate就比较简单了,直接继承了redistemplate,在初始化时默认使用了string序列化,源码如下:

public class StringRedisTemplate extends RedisTemplate<String, String> {
    public StringRedisTemplate() {
        this.setKeySerializer(RedisSerializer.string());
        this.setValueSerializer(RedisSerializer.string());
        this.setHashKeySerializer(RedisSerializer.string());
        this.setHashValueSerializer(RedisSerializer.string());
    }
    // 其他方法略...
}

那么就可以得出一个结论,如果你想使用默认的配置来操作redis,则如果操作的数据是字节数组,就是用redistemplate,如果操作的数据是明文,使用stringredistemplate。

当然在项目中真实使用时,一般是自定义redistemplate的bean实例,来设置具体的序列化策略,说白了就是redistemplate通过自定义bean可以实现和stringredistemplate一样的序列化,使用起来更加灵活。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RedisTemplate和StringRedisTemplate的区别 的相关文章

随机推荐

  • System Error Codes

    From http msdn microsoft com en us library windows desktop ms681382 28v vs 85 29 aspx Applies to desktop apps only Note
  • 如何开通TikTok广告账户?

    如何开通TikTok广告账户 大家好 我是项柚 一个专注于讨论TikTok玩法的跨境电商自媒体人 每天不断输出干货给需要的朋友 希望大家能少走弯路 TikTok Ads是TikTok广告投放的管理后台 汇集多款海外流量产品 覆盖 150 多
  • 数据库单表数据过亿_最受欢迎的三大数据库,你用过吗?

    随着市场的多元化 需求场景多样化 数据库也层出不穷 来适应不同的业务场景 今天小编就给大家总结一下目前下面来总结下目前最受欢迎的三大数据库 快来看看你有没有用过吧 1 MySQL MySQL是一种关系型数据库管理系统 关系数据库将数据保存在
  • C#和.NET FrameWork概述

    NET FrameWork是什么 NET FrameWork是由微软开发的一种面相对象的环境框架 特点如下 多平台 可在各种计算机 服务器 手机上运行 标准化通讯协议 如XML HTTP JSON等 安全性 CLR检查并确保参数及数据对象的
  • imx6之camera mipi

    1 IPU imx6qp有2个IPU 每个IPU有2个CSI 这个CSI并不是MIPI CSI 是内部的功能模块 static struct mipi csi2 platform data mipi csi2 pdata chans 4 m
  • js计算大额数据当中丢失精度以及消除科学计数法解决方案—decimal.js的使用

    目录 decimal js使用场景 decimal js介绍 decimal js使用 1 安装依赖 2 引入并使用 decimal js函数封装 decimal js使用场景 js有精度问题 对于一些金额的计算就总是与偶莫名其妙的问题 d
  • Java实战系列(1):SpringBoot+ShardingSphere实现多数据源切换

    主要组件版本信息 SpringBoot 2 2 8 RELEASE MyBatis Plus 3 3 2 ShardingSphere 4 0 0 RC2 需求说明 在企业开发中 如果业务数据分布在不同的数据源 那么我们就希望在访问业务数据
  • Linux查看进程和线程的CPU使用率、内存占用情况(找出那个捣蛋鬼)

    查看 cpu 占用率高的线程 ps H eo user pid ppid tid time cpu cmd sort cpu 例如 2 查看占用内存最多的程序 ps aux head 1 ps aux grep v PID sort rn
  • column in where clause is ambiguous MySQL异常

    在多表连接查询中 若连接条件字段在多个表中同名 却没有使用全限定名称 如 logicdeleteFlag 执行时会报这个异常 MySQL没办法识别 这个字段指的是哪个表的字段 必须使用全限定名称 如 tableName logicdelet
  • 尽量以const、enum、inline替换 #define——条款02

    这个条款或许改为 宁可以编译器替换预处理器 比较好 因为或许 define 不能被视为语言的一部分 一 比如定义一个宏 define ASPECT RATIO 1 653 这个ASPECT RATIO也许从未被编译器看见 也许在编译器开始处
  • [开发心得]Electron应用自动升级 autoUpdater的使用。

    前言 博主主攻后端 对于electron自动升级也是费了非常多的事儿 github gitee也下载了很多源码 发现案例可能好用 但是很难融入公司的项目 要注意的点如下 1 Electron版本问题 2 Electron Vue版本问题 我
  • 点评10款Github上最火爆的国产开源项目

    衡量一个开源产品好不好 看看产品在Github的Star数量就知道了 由此可见 Github已经沦落为开源产品的 大众点评 了 一个开源产品希望快速的被开发者知道 快速的获取反馈 放到Github上面就可以了 AD WOT2015 互联网运
  • 数组元素的比较

    Java 1 0 和 1 1 的类库缺少许多特性 其中之一就是缺少算法操作 甚至是简单的排 序操作都没有 对于盼望能得到一个无所不有的标准类库的人来说 缺少这些操作是很 难以理解的 幸好 Java 2 对此作了补救 至少解决了排序问题 书写
  • 如何搭建自己的图床(GitHub版)

    文章目录 1 图床的概念 2 用GitHub创建图床服务器 2 1 新建仓库 2 2 生成Token令牌 2 3 创建img分支和该分支下的img文件夹 可选 3 使用PicGo软件上传图片 3 1 下载PicGo软件 3 2配置PicGo
  • 一张表格分成两页打印_word一页内容怎么分成两页打印

    word一页内容怎么分成两页打印 我们经常在打印时会选择把两页A4打在一张A3上 但有的时候也会需要把一张A3的内容分成两页A4来打印 那么 如何进行操作呢 下面就来看看小编的做法吧 调整页面布局 页面设置 纸张 将纸张大小有A3修改为A4
  • 如何用python画雪人_小雪人图案

    效果图如下 代码如下 import turtle t turtle Turtle t speed 0 右眼睛 t up t goto 80 80 t down t begin fill t circle 20 t end fill 右眉毛
  • blender bpy入门笔记

    目录 bpycv 加载 渲染demo 可以导出图片 但是图片为空 导出obj模型 随机旋转 录制常见脚本 渲染属性 胶片 gt 透明 其他命令 bpycv https github com DIYer22 bpycv 加载 渲染demo i
  • MMSegmentation训练自己的分割数据集

    首先确保在服务器上正常安装了MMSeg 注意安装完还需建立与自己的数据集之间的软连接 官方安装教程如下 https github com open mmlab mmsegmentation blob master docs get star
  • Python flask-restful 框架讲解

    1 简介 Django 和 Flask 一直都是 Python 开发 Web 的首选 而 Flask 的微内核更适用于现在的云原生微服务框架 但是 Flask 只是一个微型的 Web 引擎 所以我们需要扩展 Flask 使其发挥出更强悍的功
  • RedisTemplate和StringRedisTemplate的区别

    RedisTemplate和StringRedisTemplate的区别 1 两者的关系是StringRedisTemplate继承RedisTemplate 2 两者的数据是不共通的 也就是说StringRedisTemplate只能管理