当前位置: 首页 > news >正文

【Spring连载】使用Spring Data访问Redis(四)----RedisTemplate

【Spring连载】使用Spring Data访问Redis(四)----RedisTemplate通过RedisTemplate处理对象Working with Objects through RedisTemplate

  • 一、专注String的便利类
  • 二、Serializers

大多数用户可能使用RedisTemplate及其相应的包org.springframework.data.redis.core或其reactive变体ReactiveRedisTemplate。由于其丰富的功能集,该template实际上是Redis模块的中心类。template为Redis交互提供了高级抽象。虽然[Reactive]RedisConnection提供了接受和返回二进制值(byte数组)的low-level方法,但template负责序列化和连接管理,使用户无需处理这些细节。
RedisTemplate类实现了RedisOperations接口,其reactive变体ReactiveRedisTemplate实现了ReactiveRedisOperations。
引用[Reactive]RedisTemplate实例上的操作的首选方式是通过[Reactive]RedisOperations接口。
此外,template提供了操作视图(遵循Redis命令参考中的分组),这些视图提供了丰富的通用接口,用于(通过KeyBound接口)对特定类型或特定key进行操作,如下表所示:
操作视图:

接口描述
Key Type 操作
GeoOperationsRedis geospatial 操作, 例如 GEOADD, GEORADIUS,…​
HashOperationsRedis hash 操作
HyperLogLogOperationsRedis HyperLogLog 操作, 例如 PFADD, PFCOUNT,…​
ListOperationsRedis list 操作
SetOperationsRedis set操作
ValueOperationsRedis string (或 value)操作
ZSetOperationsRedis zset (或 sorted set)操作
Key Bound 操作
BoundGeoOperationsRedis key bound geospatial操作
BoundHashOperationsRedis hash key bound操作
BoundKeyOperationsRedis key bound操作
BoundListOperationsRedis list key bound操作
BoundSetOperationsRedis set key bound操作
BoundValueOperationsRedis string (或 value) key bound操作
BoundZSetOperationsRedis zset (或 sorted set) key bound操作

配置后,template是线程安全的,可以在多个实例中重复使用。
RedisTemplate的大部分操作都使用基于Java的序列化程序。这意味着template写或读的任何对象都通过Java进行序列化和反序列化。
你可以更改template上的序列化机制,Redis模块提供了几个实现,这些实现在org.springframework.data.redis.serializer包中提供。有关详细信息,请参阅序列化程序。你还可以将任何序列化程序设置为null,并通过将enableDefaultSerializer属性设置为false让RedisTemplate使用原始字节数组(raw byte arrays)。请注意,template要求所有键都为非null。但是,只要底层序列化程序接受null值,它们就可以为null。有关更多信息,请阅读每个序列化程序的Javadoc。
对于需要某个template视图的情况,请将该视图声明为依赖项并注入template。容器自动执行转换,消除opsFor[X]调用,如以下示例所示:
配置 Template API

@Configuration
class MyConfig {@BeanLettuceConnectionFactory connectionFactory() {return new LettuceConnectionFactory();}@BeanRedisTemplate<String, String> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, String> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);return template;}
}

使用RedisTemplate将一个元素推送到List中

public class Example {// inject the actual operations@Autowiredprivate RedisOperations<String, String> operations;// inject the template as ListOperations@Resource(name="redisTemplate")private ListOperations<String, String> listOps;public void addLink(String userId, URL url) {listOps.leftPush(userId, url.toExternalForm());}
}

一、专注String的便利类

由于Redis中存储的键和值通常是java.lang.String,Redis模块为RedisConnection和RedisTemplate提供了两个扩展,分别是StringRedisConnection(及其DefaultStringRedisConnection实现)和StringRedisTemplate,作为密集String操作的一站式解决方案。除了绑定到String键之外,template和连接还使用了StringRedisSerializer,这意味着存储的键和值是可读的(假设Redis和代码中使用相同的编码)。以下列表显示了一个示例:

@Configuration
class RedisConfiguration {@BeanLettuceConnectionFactory redisConnectionFactory() {return new LettuceConnectionFactory();}@BeanStringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}
}
public class Example {@Autowiredprivate StringRedisTemplate redisTemplate;public void addLink(String userId, URL url) {redisTemplate.opsForList().leftPush(userId, url.toExternalForm());}
}

与其他Spring模板一样,RedisTemplate和StringRedisTemplate可以通过RedisCallback接口直接与Redis对话。此功能可以给你完全的控制,因为它可以直接与RedisConnection对话。请注意,当使用StringRedisTemplate时,回调将接收StringRedisConnection的实例。下面的例子展示了如何使用RedisCallback接口:

public void useCallback() {redisOperations.execute(new RedisCallback<Object>() {public Object doInRedis(RedisConnection connection) throws DataAccessException {Long size = connection.dbSize();// Can cast to StringRedisConnection if using a StringRedisTemplate((StringRedisConnection)connection).set("key", "value");}});
}

二、Serializers

从框架的角度来看,Redis中存储的数据只有字节。虽然Redis本身支持各种类型,但在大多数情况下,这些类型指的是数据的存储方式,而不是它所代表的内容。由用户决定是将信息转换为字符串还是任何其他对象。
在Spring Data中,用户(自定义)类型和原始数据之间的转换由Spring Data Redis中的org.springframework.data.redis.serializer包处理。
此包包含两种类型的序列化程序,顾名思义,它们负责序列化过程:

  • 基于RedisSerializer的双向序列化程序。
  • 使用RedisElementReader和RedisElementWriter的元素读取器和写入器。

这些变体之间的主要区别在于RedisSerializer主要序列化到byte[],而读写器使用ByteBuffer。
有多种实现(包括本文档中已经提到的两种):

  • JdkSerializationRedisSerializer,默认用于RedisCache和RedisTemplate。
  • StringRedisSerializer。

但是,可以通过Spring OXM支持使用OxmSerializer进行Object/XML映射,或者使用Jackson2JsonRedisSerializer或GenericJackson2JsonRedisSerializer以JSON格式存储数据。
请注意,存储格式不仅限于值。它可以用于键、值或哈希,没有任何限制。

默认情况下,RedisCache和RedisTemplate被配置为使用Java native序列化。众所周知,Java native序列化允许运行由payloads引起的远程代码,这些payloads利用易受攻击的库和类注入未经验证的字节码。操作输入可能导致在反序列化步骤期间在应用程序中运行不需要的代码。因此,不要在不受信任的环境中使用序列化。通常,强烈建议你使用其他消息格式(如JSON)。
如果你担心Java序列化导致的安全漏洞,请考虑核心JVM级别的通用序列化筛选器机制:

  • 筛选传入的序列化数据。
  • JEP 290。
  • OWASP:不可信数据的反序列化。

相关文章:

【Spring连载】使用Spring Data访问Redis(四)----RedisTemplate

【Spring连载】使用Spring Data访问Redis&#xff08;四&#xff09;----RedisTemplate通过RedisTemplate处理对象Working with Objects through RedisTemplate 一、专注String的便利类二、Serializers 大多数用户可能使用RedisTemplate及其相应的包org.springframework.data.r…...

WriteFlow写作流GPT应用,激发创意的写作助手

写作是一项充满挑战的任务&#xff0c;有时我们会遇到写作灵感枯竭、思路混乱、语言表达困难等问题。为了帮助人们克服这些困难&#xff0c;我创建了一个名为WriteFlow的写作工具&#xff0c;它是一个基于GPT技术的智能助手&#xff0c;旨在激发创意&#xff0c;提供Prompt提示…...

matlab对负数开立方根得到虚数的解决方案

问题描述&#xff1a;在matlab中&#xff0c;对负数开立方根&#xff0c;不出意外你将得到虚数。 例如 − 27 3 \sqrt[3]{-27} 3−27 ​&#xff0c;我们知道其实数解是-3&#xff0c;但在matlab中的计算结果如下&#xff1a; 问题原因&#xff1a;matlab中的立方根运算是在…...

NFTScan 与 OneID 达成合作伙伴,支持多类型 DID 搜索!

近日&#xff0c;NFT 数据基础设施 NFTScan 与一体化数字身份解决方案 OneID 达成合作伙伴关系&#xff0c;双方将在 NFT 数据层面展开合作。为 Web3 用户带来优质的 NFT 搜索查询交互体验&#xff0c;向更安全和更有效的去中心化生态系统迈出的重要一步。 NFTScan 浏览器现已支…...

c# textbox 提示文字

1. 定义提示文字内容 private readonly string RemarkText "最多输入100字"; // 提示文字 2. 添加textbox 焦点事件&#xff0c; 初始化textbox提示文字和字体颜色 public UserControl(){InitializeComponent();tb_Remark.Text RemarkText;tb_Remark.ForeColor…...

Springfox Swagger3从入门案例

首先&#xff0c;在pom.xml中添加依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io…...

HarmonyOS NEXT 星河版项目案例

参考代码&#xff1a;HeimaHealthy: 鸿蒙项目案例练习 (gitee.com) 1.欢迎页面 Entry Component struct WelcomePage {State message: string Hello Worldbuild() {Column({space: 10}) {Row() {// 1.中央slogonImage($r(app.media.home_slogan)).width(260)}.layoutWeight(…...

房屋租赁系统-java

思维导图&#xff1a;业务逻辑 类的存放&#xff1a; 工具类 Utility package study.houserent.util; import java.util.*; /***/ public class Utility {//静态属性。。。private static Scanner scanner new Scanner(System.in);/*** 功能&#xff1a;读取键盘输入的一个菜单…...

docker环境搭建及其安装常用软件

centos安装docker Install Docker Engine on CentOS | Docker Docs 下载docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io…...

【Spring连载】使用Spring Data访问Redis(三)----连接模式

【Spring连载】使用Spring Data访问Redis&#xff08;三&#xff09;----连接模式Connection Modes 一、Redis Standalone二、向Master写入&#xff0c;从Replica读取三、Redis Sentinel四、Redis Cluster Redis可以在各种设置中运行。每种操作模式都需要特定的配置&#xff0c…...

ppt背景图片怎么设置?让你的演示更加出彩!

PowerPoint是一款广泛应用于演示文稿制作的软件&#xff0c;而背景图片是演示文稿中不可或缺的一部分。一个好的背景图片能够提升演示文稿的整体效果&#xff0c;使观众更加关注你的演示内容。可是ppt背景图片怎么设置呢&#xff1f;本文将介绍ppt背景图片设置的三个方法&#…...

SQL 关键字参考手册(一)

目录 SQL 关键字 SQL ADD 关键字 ADD SQL ADD CONSTRAINT 关键字 ADD CONSTRAINT SQL ALTER 关键字 ALTER TABLE ALTER COLUMN SQL ALTER COLUMN 关键字 ALTER COLUMN SQL ALTER TABLE 关键字 ALTER TABLE SQL ALL 关键字 ALL SQL AND 关键字 AND SQL ANY 关键…...

快速排序|超详细讲解|入门深入学习排序算法

快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是&#xff1a;选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据都比另外一部分的所有数据都要小。然后&#xff0c;再按此方法对这两部分数据分别进…...

指针+一维整型数组的基本运用 和 指针+一维整型数组的初步学习

一&#xff0c;调式程序的技巧&#xff1a; 1.明确问题 2.定位问题 3.加打印&#xff08;打印核心数据0&#xff09; 二&#xff0c;指针的回顾 1.指针的概念&#xff1a;指针就是地址&#xff08;内存单元的编号&#xff09;&#xff0c;是一个数据类型&#xff08;指针类型…...

APP测试基本流程以及APP测试要点总结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 APP测试实际上依然属于软件测试的范畴&#xff0c;是软件测试的一个真子集&#xff0c;所以经典软…...

GPT-4 Vision调试任何应用,即使缺少文本日志 升级Streamlit七

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…...

ppt形状导入draw.io

draw.io里面的形状还是有点少&#xff0c;我有时想找一个形状&#xff0c;发现PPT里有&#xff0c;但draw.io里有&#xff0c;比如 也就是这个形状 最简单的想法就是我直接把这个形状在PPT里存成图片&#xff08;png)&#xff0c;然后再导入到draw.io里&#xff0c;但是结果是…...

GoLang和GoLand的安装和配置

1. GoLang 1.1 特点介绍 Go 语言保证了既能达到静态编译语言的安全和性能&#xff0c;又达到了动态语言开发维护的高效率&#xff0c;使用一个表达式来形容 Go 语言&#xff1a;Go C Python , 说明 Go 语言既有 C 静态语言程序的运行速度&#xff0c;又能达到 Python 动态语…...

BGAD文章复现笔记-1

文章名&#xff1a;《Explicit Boundary Guided Semi-Push-Pull Contrastive Learning for Supervised Anomaly Detection》 原作者代码&#xff1a;https://github.com/xcyao00/BGAD 复现过程&#xff1a; 系统Ubuntu22.04, PyTorch1.12.1&#xff0c;python3.9 下载原作者…...

【EI会议推荐】第六届下一代数据驱动网络国际学术会议(NGDN 2024)

第六届下一代数据驱动网络国际学术会议&#xff08;NGDN 2024&#xff09; The Sixth International Conference on Next Generation Data-driven Networks 2024年4月26-28日 | 中国沈阳 *NGDN 2024已进入中国学术会议在线推荐列表&#xff1a;Click 基于前几届在英国埃克塞…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

【Java】Ajax 技术详解

文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…...