SpringDataRedis 使用

2023-11-10

1. SpringDataRedis 特点

  • 提供了对不同 Redis 客户端的整合(Lettuce 和 Jedis)
  • 提供了 RedisTemplate 统一 API 来操作 Redis
  • 支持 Redis 的发布订阅模型
  • 支持 Redis 哨兵和 Redis 集群
  • 支持基于 Lettuce 的响应式编程
  • 支持基于 JDK、JSON、字符串、Spring 对象的数据序列化及反序列化
  • 支持基于 Redis 的 JDKCollection 实现

SpringDataRedis 中提供了 RedisTemplate 工具类,其中封装了各种对 Redis 的操作。并将不同数据类型的操作 API 封装到了不同的类型中:

API 返回值类型 说明
redisTemplate.opsForvalue() valueOperations 操作 String 类型数据
redisTemplate.opsForHash() HashOperations 操作 Hash 类型数据
redisTemplate.opsForList() ListOperations 操作 List 类型数据
redisTemplate.opsForSet() SetOperations 操作 Set 类型数据
redisTemplate.opsForZSet() ZSetOperations 操作 SortedSet 类型数据

2. 使用 SpringDataRedis 步骤

1. 创建项目

在这里插入图片描述

这里注意选2的版本

在这里插入图片描述

2. 引入依赖

<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
             </dependency>

在这里插入图片描述

3. 配置 Redis

spring:
  redis:
    host: 140.210.207.112
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 100ms

在这里插入图片描述

4. 注入 RedisTemplate,编写测试用例

@Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        //写入一条 string 数据
        redisTemplate.opsForValue().set("name","李四");
        //获取 string 数据
        Object name = redisTemplate.opsForValue().get("name");
        //打印
        System.out.println("name = "+name);
    }

在这里插入图片描述

在这里插入图片描述

但我们发现 redis 里面没有存进去

在这里插入图片描述

用可视化工具查看一下:

在这里插入图片描述

这个是序列化的问题,RedisTemplate 可以接收任意 Object 作为值写入 Redis,只不过写入前会把 Object 序列化为字节形式,默认就是采用 JDK 序列化。

在这里插入图片描述

3. 自定义 RedisTemplate 序列化

先引入 Jackson 依赖:

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
@Configuration
public class RedisConfig {

    @Resource
    RedisConnectionFactory connectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate(){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
                new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

在这里插入图片描述

在这里插入图片描述

这样就可以读取到了:

在这里插入图片描述

但在服务器上值还是乱码:

在这里插入图片描述

我们启动服务器命令在后面加上 --raw就好了

在这里插入图片描述

在这里插入图片描述

redisTemplate 可以操作着不同的数据类型,api 和我们的指令是一样的。
opsForValue:操作字符串 -> String
opsForList:操作 List -> List
opsForSet:操作 Set -> Set
opsForHash:操作 Hash
opsForZSet:操作 ZSet
opsForGeo:操作 Geospatial
opsForHyperLogLog: 操作 HyperLogLog
除了基本的操作,我们常用的方法都可以直接通过 redisTemplate 操作,比如事务,和基本的 CRUD。

在这里插入图片描述

4. SpringDataRedis 操作对象

在这里插入图片描述

这里不使用无参构造方法会报错,注意一下:

在这里插入图片描述

在这里插入图片描述

这里采用了 JSON 序列化来代替默认的 JDK 序列化方式:

在这里插入图片描述

整体可读性有了很大提升,并且能将Java对象自动的序列化为 JSON 字符串,并且查询时能自动把 JSON 反序列化为 Java 对象。不过,其中记录了序列化时对应的 class 名称,目的是为了查询时实现自动反序列化。这会带来额外的内存开销。

所以我们为了节省内存空间,我们可以不使用 JSON 序列化器来处理 value,而是统一使用 String 序列化器,要求只能存储 String 类型的 key 和 value。当需要存储 Java 对象时,手动完成对象的序列化和反序列化。

在这里插入图片描述

这样我们存入和读取时的序列化及反序列化都是我们自己实现的,SpringDataRedis 就不会将 class 信息写入Redis了。

这种用法比较普遍,因此 SpringDataRedis 就提供了 RedisTemplate 的子类:StringRedisTemplate,它的 key 和 value 的序列化方式默认就是 String 方式。
在这里插入图片描述

@Autowired
    private StringRedisTemplate stringRedisTemplate;
    // JSON序列化工具
    private static final ObjectMapper mapper = new ObjectMapper();

    @Test
    void testSaveUser2() throws JsonProcessingException {
        // 创建对象
        User user = new User("张三", 22);
        // 手动序列化
        String JSON = mapper.writeValueAsString(user);
        // 写入数据
        stringRedisTemplate.opsForValue().set("user", JSON);

        // 获取数据
        String jsonUser = stringRedisTemplate.opsForValue().get("user");
        // 手动反序列化
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println("user1 = " + user1);
    }

在这里插入图片描述

在这里插入图片描述

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

SpringDataRedis 使用 的相关文章

  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • Java:迭代 Collection 的最佳方法(此处为 ArrayList)

    今天 当我看到一段我已经使用了数百次的代码时 我很高兴地开始编码 迭代集合 此处为 ArrayList 出于某种原因 我实际上查看了 Eclipse 的自动完成选项 这让我想知道 在什么情况下以下循环比其他循环更好使用 经典的数组索引循环
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • OSGi:如果不取消服务会发生什么

    这是我获取 OSGi 服务的方式 ServiceReference reference bundleContext getServiceReference Foo class getName Foo foo Foo bundleContex
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • JavaFX 中具有自定义内容的 ListView

    How i can make custom ListView with JavaFx for my app I need HBox with image and 2 Labels for each line listView 您可以通过查看
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 将 Azure AD 高级自定义角色与 Spring Security 结合使用以进行基于角色的访问

    我创建了一个演示 Spring Boot 应用程序 我想在其中使用 AD 身份验证和授权 并使用 AD 和 Spring Security 查看 Azure 文档 我执行了以下操作 package com myapp contactdb c
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的

随机推荐

  • python处理excel格式变化,分类,归类,行变列

    上图转换成下图 格式转换 方法一 import pandas as pd data1 pd read csv r C path1 csv encoding gb18030 rows data1 shape 0 获取行数 shape 1 获取
  • 【转】matlab学习(5) 读取excel文件

    转自 https blog csdn net thy19988 article details 78489623 1 使用函数xlsread读取单个文件 1 num xlsread filename filename是单引号括起来的带路径的
  • RC电路(二):耦合

    一 微分变换电路及波形 A 简单微分电路中 数值与输入方波宽度 之间满足 时 将变成一个 耦合电路 输出波形可以跟随输入波形 电路如下图所示 上图红框部分放大后如下图所示 在 时 由 因电容电压不能突变 来不及充电 相当于短路 输入电压 全
  • Matlab中快速去除字符串中的元音字母

    其实字符串可以看作一个向量 每一个字符都有一个对应的ascii值 因此在处理字符串时也可以采用常用的数值数组函数 今天小编想要介绍的内容是如何快速地去除字符串中的元音字母 学会了本节内容 你就会快速地删除字符串中的任意字符了 想必大家处理字
  • 【QT学习】01:helloqt

    helloqt OVERVIEW helloqt 一 helloqt 1 使用向导创建 2 手动创建 3 pro文件 4 Qt应用程序框架 二 按钮创建 main cpp mywidget cpp 三 对象模型 1 对象树引入 2 存在的问
  • javascript问答(含答案)

    1 我们可以在下列哪个 HTML 元素中放置 Javascript 代码 您的回答
  • 经典算法问题——稳定匹配(Stable Matching)

    经典算法问题 稳定匹配 Stable Matching 问题起源 在1962年 经济学家 David Gale 和 Lloyd Shapley 提出 能否设计一个高校录取过程 能够自我执行 self enforcing 形成一个最佳的匹配效
  • < element-Ui表格组件:表格多选功能回显勾选时因分页问题,导致无法勾选回显的全部数据 >

    文章目录 前言 一 解决思路 二 实现代码 仅供参考 具体问题具体分析 gt HTML模板 gt Js模板 往期内容 前言 在 Vue elementUi 开发中 elementUI中表格在本身是自带多选功能的 但是在某些情况下 并不能完全
  • some() 方法

    该方法是是数组的Array prototype some array some element index arr 返回值 true 或者false true 至少有一个元素 满足 方法提供的函数判断 false 一个都满足 方法提供的函数
  • 存储器的概述——DRAM动态存储器

    DRAM存储器 1 DRAM存储元的工作原理 SRAM存储器的存储位元是一一个触发器 它具有两个稳定的状态 而DRAM存储器的存储位元是由一个MOS晶体管和电容器组成的记忆电路 如图所示 2 DRAM芯片的逻辑结构 下面我们通过一个例子来看
  • SQLServer 批量修改或插入

    场景 今天在工作中遇到这么一个场景 我需要根据条件对表A做批量更新或插入 因为条件比较复杂 所以我使用了临时表B 先把需要更新或插入的数据查询出来放入临时表 然后更新表A的某字段 更新条件是A id B id 更新效果是若记录存在表A中 则
  • 大规模 Vision-Language 模型预训练的数据增强:Supervision Exists Everywhere

    Supervision Exists Everywhere A Data Efficient Contrastive Language Image Pre training Paradigm 论文地址 代码地址 主要工作 核心思想 具体实现
  • 线程池的声明需要手动进行

    Java 中的 Executors 类定义了一些快捷的工具方法 来帮助我们快速创建线程池 阿里巴巴 Java 开发手册 中提到 禁止使用这些方法来创建线程池 而应该手动 new ThreadPoolExecutor 来创建线程池 这一条规则
  • 行链接和行迁移

    行链接 Row chaining 与行迁移 Row Migration 当一行的数据过长而不能插入一个单个数据块中时 可能发生两种事情 行链接 row chaining 或行迁移 row migration 行链接 当第一次插入行时 由于行
  • fiddler抓包工具入门到入职之如何精准的定位前后端的bug

    Fiddler是一款强大的网络调试工具 可以拦截和分析HTTP请求和响应 帮助开发者定位前后端的问题 下面介绍如何使用Fiddler精准定位前后端的Bug 并使用Python代码进行操作 拦截HTTP请求和响应 打开Fiddler 在 Fi
  • 无法连接虚拟设备 sata0:1,因为主机上没有相对应的设备——解决方案

    其实并不复杂 就两个步骤 你装完虚拟机之后什么也别干 如若开虚拟机或虚拟机里面的系统时 出现标题状况 则可以这样解决 1 点击虚拟机 再点击左侧页面编辑虚拟机设置 2 选择CD DVD IDE 将使用物理驱动器的选项改为下方的使用ISO映像
  • 什么是IDaaS?推荐一款开源的IDaaS产品

    IDaaS是云时代的身份和访问管理 IAM 他们之间的关系 IDaaS SaaS IAM IDaaS是一个云服务平台 客户使用提供IDaaS服务相关的产品 例如单点登录 智能多因素认证 来实现云时代所需的既安全又高效的身份和访问管理功能 一
  • 保持工作稳定情绪与心理健康的八大秘诀

    近期发生的新闻热点再度引发公众对稳定情绪和心理健康的关注 有时候我们遇到的最大的敌人 不是运气也不是能力 而是失控的情绪和口无遮拦的自己 如何在工作中保持稳定的情绪 谈谈你的看法 在工作中保持稳定的情绪对于个人的心理健康和工作效率都至关重要
  • 并行单边jacobi算法 奇偶序列

    单边jacobi算法大家都非常熟悉 就是不停地计算旋转矩阵 简单说就是计算c和s 然后旋转 然而其中做一轮旋转 任何两列都需要旋转一次 需要n n 1 2次单独的旋转 这样的旋转其实是可以并行来实现的 这也就是为何jacobi算法最近比较热
  • SpringDataRedis 使用

    1 SpringDataRedis 特点 2 使用 SpringDataRedis 步骤 3 自定义 RedisTemplate 序列化 4 SpringDataRedis 操作对象 1 SpringDataRedis 特点 提供了对不同