SpringDataRedis 使用

news2024/11/25 22:43:47

  • 1. SpringDataRedis 特点
  • 2. 使用 SpringDataRedis 步骤
  • 3. 自定义 RedisTemplate 序列化
  • 4. SpringDataRedis 操作对象

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);
    }

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/922676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现企业微信群告警

Python实现企业微信告警 1. 创建企业微信群机器人 1-1. 什么是企业微信群机器人&#xff1f; 企业微信群机器人是企业微信平台提供的一种功能&#xff0c;可以通过Webhook方式将消息发送到指定的企业微信群中。它可以用于自动化发送通知、告警等信息&#xff0c;实现监控和信…

机器学习深度学习——NLP实战(自然语言推断——微调BERT实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——针对序列级和词元级应用微调BERT &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文…

学习JAVA打卡第三十八天

String 类的常用方法 ⑴public int length&#xff08;&#xff09; String 类中的length&#xff08;&#xff09;方法获取了一个String对象的字符序列的长度&#xff0c;例如&#xff1a; String china “1945年抗战胜利”&#xff1b; int n1,n2&#xff1b; n1china.leng…

CentOS镜像下载

官网下载链接&#xff1a;http://isoredirect.centos.org/centos/7/isos/x86_64/ step1: 进入下载页&#xff0c;选择阿里云站点进行下载 Actual Country 国内资源 Nearby Countries 周边国家资源 阿里云站点&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64/ …

如何自己实现一个丝滑的流程图绘制工具(一)vue如何使用

背景 项目需求突然叫我实现一个类似processOn一样的在线流程图绘制工具。 这可难倒我了&#xff0c;立马去做调研&#xff0c;在github上找了很多个开源的流程图绘制工具&#xff0c; 对比下来我还是选择了 bpmn-js 原因&#xff1a; 1、他的流程图是涉及到业务的&#xff0c…

MybatisPlus 项目中使用

大家好 , 我是苏麟 , 今天带来 MybatisPlus 的简单使用 . 官方网站 : MyBatis-Plus (baomidou.com) 开始使用 初步体验 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version…

byte-budddy: Unexpected type reference on method: 19

使用byte-buddy版本为1.10.1 在使用agent时&#xff0c;启动应用&#xff0c;报错如下 造成报错的相关代码 Data public class CloudAccountUpdateReq implements Serializable {private List<Valid CloudAccountDiscountDTO> discountList;}已修复 issue: https://gi…

ClassLoad Of Java

序言 简单学习下ClassLoad的过程cuiyaonan2000163.com 过程 我们有一个x.java文件通过执行javac命令可以变成x.class文件&#xff0c;当我们调用Java命令的时候class文件会被装载到内存中&#xff0c;这个过程叫做classloader。 一般情况下我们自己写代码的时候会用到Java的类…

(6)(6.6) 恢复任务回放

文章目录 前言 6.6.1 配置 6.6.2 工作原理 6.6.3 局限性 前言 本页介绍了什么是"任务继续时后退"功能以及如何使用该功能。 &#xff01;Note 从 4.1 版起&#xff0c;Plane、Copter 和 Rover 均可使用此功能。 在某些应用或运行区域&#xff0c;为了消除冲突…

Nat. Photonics:实时捕获了光子的量子纠缠!

渥太华大学的研究人员与罗马大学的Danilo Zia和Fabio Sciarrino合作&#xff0c;展示了一种新技术&#xff0c;可以实时可视化两个纠缠光子&#xff08;构成光的基本粒子&#xff09;的波函数。 研究成果以“Interferometric imaging of amplitude and phase of spatial biphot…

如何在 Opera 中启用DNS over HTTPS

DNS over HTTPS&#xff08;基于HTTPS的DNS&#xff09;是一种更安全的浏览方式&#xff0c;但大多数 Web 浏览器默认情况下不启用它。了解如何在 Opera 浏览器中启用该功能。 您可能不知道这一点&#xff0c;但您的网络浏览器并不像您希望的那样私密或安全。您会看到&#xff…

华为官方翻新产品上架首款PC产品,售价3699元起!

8月24日&#xff0c;华为官方翻新产品上架首款PC——HUAWEI Matebook 14s&#xff01;产品搭载2.5K高刷触控屏&#xff0c;有第11代英特尔酷睿i7-113700H和酷睿i5-11300H两种处理器可选择&#xff0c;售价3699元起&#xff01; 华为官方翻新PC&#xff0c;品质接近新机&…

node.js 简单使用 开始

1.概要 问&#xff1a;体验一下node.js 看一下如何运行。 答&#xff1a;使用命令 node 文件名.js 2.举例 2.1 代码准备(main.js) console.log(第一行node.js代码); 2.2 运行效果

Linux内核学习(八)—— 内存管理(基于Linux 2.6内核)

目录 一、页&#xff08;page&#xff09; 二、区&#xff08;zone&#xff09; 三、页操作 四、kmalloc() 五、vmalloc() 六、slab 分配器 七、在栈上的静态分配 一、页&#xff08;page&#xff09; 内核把物理页作为内存管理的基本单位。尽管处理器的最小可寻 …

Crontab定时任务运行Docker容器(Ubuntu 20)

对于一些离线预测任务&#xff0c;或者D1天的预测任务&#xff0c;可以简单地采用Crontab做定时调用项目代码运行项目 Crontab简介&#xff1a; Linux crontab命令常见于Unix和类Unix的操作系统之中&#xff0c;用于设置周期性被执行的指令。该命令从标准输入设备读取指令&…

微信通过好友自动回复怎么设置?微信怎么设置自动回复?

当通过了很多客户之后&#xff0c;员工没有办法及时的给每位客户发送欢迎消息&#xff0c;并且发送欢迎消息时也是由员工一个一个去发送给客户&#xff0c;这样既浪费了大量的时间&#xff0c;又给员工增加工作负担&#xff0c;降低工作效率。 我们可以设置自动发欢迎语&#…

小猫爪:嵌入式小知识16-XCP协议简介

小猫爪&#xff1a;嵌入式小知识16-XCP协议简介 0 目录1 前言2 XCP协议简介2.1 各种包2.1 CMD2.2 RES2.3 ERR2.4 EV2.5 SERV2.6 DAQ2.7 STIM2.8 总结 2.2 错误处理2.2.1 Time-out Error Handling2.2.2 Error Code Error Handling END 0 目录 小猫爪&#xff1a;嵌入式小知识15…

More Effective C++学习笔记(4)

目录 条款16&#xff1a;谨记 80 - 20 法则条款17&#xff1a;考虑使用lazy evaluation&#xff08;缓式评估&#xff09;条款18&#xff1a;分期摊还预期的计算成本条款19&#xff1a;了解临时对象来源条款20&#xff1a;协助完成 “ 返回值优化 ”条款21&#xff1a;利用重载…

余压监控在建筑加压送风系统中的应用

安科瑞 华楠 摘 要&#xff1a;从风量、风管和风口的设计、防烟部位正压控制方式等角度&#xff0c;分析了加压送风系统设计中需要注意的几点问题&#xff1a;风量的确定需合理有据&#xff1b;楼梯间风管和风口的设计需考虑均匀送风要求&#xff0c;前室风口设计确保不同楼层…

【地理图库】晨昏线示意图

声明&#xff1a;本资料整理&#xff0c;仅供学习&#xff01;