Redis - SpringDataRedis - RedisTemplate

目录

概述

创建项目

引入依赖

配置文件

测试代码

测试结果

数据序列化器

自定义RedisTemplate的序列化方式

测试报错

添加依赖后测试

存入一个 String 类型的数据

测试存入一个对象

优化 -- 手动序列化

测试存入一个Hash

总结:


概述

SpringDataSpring数据操作的模块,包含对各种数据库的集成,其中对 Redis 的集成模块就叫做 SpringDataRedis

官网地址:Spring Data Redis

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

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

创建项目

引入依赖

       <!--redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--common-pool--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

配置文件

spring:redis:host: 192.168.50.130port: 6379password: 123456database: 1  # 选择了1号库lettuce:pool:max-active: 8  #最大连接max-idle: 8   #最大空闲连接min-idle: 0   #最小空闲连接max-wait: 100ms #连接等待时间

测试代码

    @Autowiredprivate RedisTemplate redisTemplate;@Testvoid testString() {// 写入一条String数据redisTemplate.opsForValue().set("name","luyuan");// 获取String数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name == " + name);}

测试结果

数据序列化器

但是可视化软件里面显示的值是一长串 -- 这是因为序列化的问题,

这是Redis的几个序列化器

我们debug一下刚刚的程序

F7 步入

F7 步入

可以见到这个是默认的 JdkSerializationRedisSerializer

使用 JdkSerializationRedisSerializer 缺点:

  • 可读性差
  • 内存占用较大 --- 很长一大段

自定义RedisTemplate的序列化方式

    @Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {// 创建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;}

测试报错

报错原因:少了一个jackson序列化的依赖,springmvc中会有这个依赖,但是本项目中没有添加

        <!--Jackson依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

添加依赖后测试

存入一个 String 类型的数据

Redis可视化端查看数据正常插入,对比没有自定义序列化器 ,现在序列化正常。

未定义序列化器 使用默认的序列化器的结果

定义了序列化器 后的结果

测试存入一个对象
@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Testvoid testString() {redisTemplate.opsForValue().set("user",new User("luyuan", 18));User user = (User) redisTemplate.opsForValue().get("user");System.out.println("user == " + user);}

"@class": "com.lhd.demo.pojo.User" 这一段完全是多余的,如果数据量很大,那这个属性会占用很多额外空间,为了避免这个空间浪费,那我们可以做个优化!!!

优化 -- 手动序列化

使用 RedisTemplate 自带的 StringRedisTemplate

    @Autowiredprivate StringRedisTemplate stringRedisTemplate;// 这个是SpringMVC自带的序列化工具 也可以使用fastJson Gson 来序列化private static final ObjectMapper mapper = new ObjectMapper();@Testvoid testSaveUser() throws JsonProcessingException {// 创建user对象User user = new User("Marry", 22);// 手动序列化String json = mapper.writeValueAsString(user);// 写入数据stringRedisTemplate.opsForValue().set("user", json);// 获取数据String json1 = stringRedisTemplate.opsForValue().get("user");	// 手动反序列化User user1 = mapper.readValue(json1, User.class);System.out.println("User == " + user1) ;}	

测试结果

可视化端:

测试存入一个Hash

跟 Java 中的 map 有点像

    @Testvoid testHash(){stringRedisTemplate.opsForHash().put("user:1","name","lhd");stringRedisTemplate.opsForHash().put("user:1","age","11");Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:1");System.out.println("entries == " + entries);}

总结:

RedisTemplate 的两种序列化实践方案:

  • 方案一:
    • 自定义RedisTemplate
    • 修改 RedisTemplate 的序列化器为 GenericJackson2JsonRedisSerializer

优点:更加方便

缺点:占用额外内存

  • 方案二:
    • 使用 StringRedisTemplate
    • 写入 Redis 时,手动把对象序列化为JSON
    • 读取 Redis 时,手动把读取到的JSON反序列化为对象

优点:不占用额外空间,数据更加纯正

缺点:需要手动操作

总的来说根据需求使用合适的方式是最好的。

 干货满满的文章:

Redis (常用数据结构和命令)-CSDN博客

Redis Java客户端(带示例代码)-CSDN博客

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

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

相关文章

《Milvus Cloud向量数据库指南》——BGE-M3:多功能、多语言、多粒度的文本表示学习模型

引言 在自然语言处理(NLP)领域,随着大数据时代的到来,对文本信息的精准处理与高效检索成为了研究热点。BERT(Bidirectional Encoder Representations from Transformers)作为近年来NLP领域的里程碑式模型,以其强大的上下文理解能力在多项任务中取得了显著成效。然而,面…

刘纪鹏:“3万亿资金将股市拉升至4000点”,你能赚?

本周刘纪鹏提出了一个观点&#xff1a;花费3万亿资金将股市拉升至4000点&#xff0c;有望带来25万亿的财富增长。 3万亿的投入与25万亿的潜在增长确实令人心动。股市并非简单的投入资金就能涨&#xff0c;还需要考虑市场情绪、经济基本面等因素的影响。举个例子&#xff0c;某个…

【leetcode 详解】找出区分值(C++思路详解):这【中等】题怎么十分钟就写完了?

评价&#xff1a;就笔者的感觉吧&#xff0c;leetcode上难度标为“中等”的题目往往不是说需要什么高深的算法来解决&#xff0c;但基本都涉及到 “问题转化” 的能力要求&#xff0c;换言之&#xff0c;难点往往在于思维。 tip&#xff1a;要解决这类问题&#xff0c;笔者推荐…

python3.10.4——Windows环境安装

python下载官网&#xff1a;https://www.python.org/downloads/ 如果安装在C盘&#xff0c;需要右键→选择“以管理员身份运行” 勾选2个按钮&#xff0c;选择自定义安装 全部选择&#xff0c;点击Next 更改安装路径 命令行检查python是否安装成功&#xff1a; 出现版本号说明…

如何使用C#自制一个Windows安装包

原文链接&#xff1a;https://www.cnblogs.com/zhaotianff/p/17387496.html 以前都在用InstallShield制作安装包&#xff0c;基本需求是能满足的&#xff0c;但也有一些缺点&#xff1a; 1、界面不能完全定制 2、不能直接调用代码里的功能 平常使用一些其它软件&#xff0c;…

数据结构(Java):Map集合Set集合哈希表

目录 1、介绍 1.1 Map和Set 1.2 模型 2、Map集合 2.1 Map集合说明 2.2 Map.Entry<K&#xff0c;V> 2.3 Map常用方法 2.4 Map注意事项及实现类 3、Set集合 3.1 Set集合说明 3.2 Set常用方法 3.3 Set注意事项及其实现类 4、TreeMap&TreeSet 4.1 集合类TreeM…

嵌入式中什么是三次握手

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 在网络数据传输中&#xf…

pytorch3d的安装

在这个网址中&#xff0c;下载对应的pytorch3d安装包 https://anaconda.org/pytorch3d/pytorch3d/files下载完成后使用下面命令进行安装 conda install ./pytorch3d-0.7.7-py39_cu118_pyt201.tar.bz2

可见性::

目录 定义&#xff1a; 解决方法&#xff1a; ①使用synchronized实现缓存和内存的同步 修改一&#xff1a; 加入语句&#xff1a; 代码&#xff1a; 修改2&#xff1a; 在代码块中加入&#xff1a; 代码&#xff1a; 执行结果&#xff1a; 原因&#xff1a; ②使用…

Linux--Socket 编程 UDP(简单的回显服务器和客户端代码)

目录 0.上篇文章 1.V1 版本 - echo server 1.1认识接口 1.2实现 V1 版本 - echo server&#xff08;细节&#xff09; 1.3添加的日志系统&#xff08;代码&#xff09; 1.4 解析网络地址 1.5 禁止拷贝逻辑&#xff08;基类&#xff09; 1.6 服务端逻辑 &#xff08;代码&…

【C/C++】printf和cout的区别

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

解析资源库架构模式

无论应用程序的设计方法和实现技术如何发展&#xff0c;数据访问仍然是任何系统都需要考虑的基础技术问题。针对数据访问过程&#xff0c;我们可以理解为任何一个系统都应该存在这样一个起点&#xff0c;我们可以从这个起点遍历到具体的数据。换句话说&#xff0c;系统中应该存…

Python爬虫掌握-----4实战(爬取视频)

我们使用爬虫时难免会遇到爬取视频的情况&#xff0c;其实爬取图片视频&#xff0c;内容都是一样的。这里以b站视频为例。 一、开始 1.找到url&#xff0c;请求url 防盗链&#xff0c;需要写在UA伪装中 正常的三步&#xff1a; 1.url 2.requests请求 3.UA伪装 import req…

2024最新网络安全自学路线,内容涵盖3-5年技能提升

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

做一个能和你互动玩耍的智能机器人之二

智能机器人硬件的一些注意事项和知识和初学者的误区。 一。不要担心不会焊接&#xff0c;我也是购买后才发现&#xff0c;现在的很多板子和元器件可以无焊接使用&#xff0c;比如借助杜邦线和面包板&#xff0c;可以很方便连接。 二。arduino有很多种&#xff0c;一般用的是n…

【Java算法专场】二分查找(上)

目录 前言 什么是二分查找&#xff1f; 二段性 ​​​​​​​​​​​​​​​​​​​​​二分查找 算法分析 算法步骤 算法代码 算法示例 模板 在排序数组中查找元素的第一个和最后一个位置 算法分析 算法步骤 算法代码 算法示例 搜索插入位置 算法分析 算法步…

IEC104转MQTT网关支持将IEC104数据转换为华为云平台可识别的格式

随着智能电网和物联网技术的深度融合&#xff0c;传统电力系统中的IEC104协议设备正逐步向更加开放、智能的物联网体系转型。华为云作为全球领先的云计算和AI服务提供商&#xff0c;其物联网平台为IEC104设备的接入与数据处理提供了强大的支撑。本文将探讨IEC104转MQTT网关在MQ…

KETTLE运行出现乱码和无法执行问题及解决方案

一、乱码问题 &#xff08;1&#xff09;出现乱码&#xff0c;在数据库连接里面的选项里面加入&#xff1a;characterEncodingutf8和tinyInt1isBitfalse &#xff08;2&#xff09;取消简易转换&#xff0c;点开表输入&#xff0c;取消”允许简易转换”选项&a…

vue3.0学习笔记(一)——vue3简介与vite脚手架的使用

1. 为什么学vue3 Vue3现状&#xff1a; vue-next 2020年09月18日&#xff0c;正式发布vue3.0版本。但是由于刚发布周边生态不支持&#xff0c;大多数开发者处于观望。现在主流组件库都已经发布了支持vue3.0的版本&#xff0c;其他生态也在不断地完善中&#xff0c;这是趋势。…

梯度下降算法在逻辑回归中的应用

逻辑回归简介 sigmoid函数&#xff1a; g ( z ) 1 1 e − z g(z) \frac{1}{1e^{-z}} g(z)1e−z1​ 逻辑回归假设函数&#xff1a; y ^ h θ ( x ) g ( θ T x ) 1 1 e − θ T x \hat{y} h_{\theta}(x) g(\theta^Tx) \frac{1}{1e^{-\theta^Tx}} y^​hθ​(x)g(θTx)…