SpringData-Redis缓存之RedisTemplate

一、概述

大多数用户可能会使用RedisTemplate及其相应的包org.springframework.data.redis.core或其反应式变体ReactiveRedisTemplate。由于其丰富的功能集,该模板实际上是Redis模块的中心类。该模板为Redis交互提供了高级抽象。虽然[Reactive]RedisConnection提供了接受和返回二进制值(字节数组)的低级方法,但模板负责序列化和连接管理,使用户无需处理此类细节。

RedisTemplate类实现RedisOperations接口,其反应变量ReactiveRedisTemplate实现ReactiveEdisOperations。

此外,该模板还提供了操作视图(遵循Redis命令参考中的分组),这些视图提供了丰富的通用接口,用于处理特定类型或特定键(通过KeyBound接口),如下表所述:

操作视图:

InterfaceDescription

Key Type Operations

GeoOperations

Redis geospatial operations, such as GEOADDGEORADIUS,…​

HashOperations

Redis hash operations

HyperLogLogOperations

Redis HyperLogLog operations, such as PFADDPFCOUNT,…​

ListOperations

Redis list operations

SetOperations

Redis set operations

ValueOperations

Redis string (or value) operations

ZSetOperations

Redis zset (or sorted set) operations

Key Bound Operations

BoundGeoOperations

Redis key bound geospatial operations

BoundHashOperations

Redis hash key bound operations

BoundKeyOperations

Redis key bound operations

BoundListOperations

Redis list key bound operations

BoundSetOperations

Redis set key bound operations

BoundValueOperations

Redis string (or value) key bound operations

BoundZSetOperations

Redis zset (or sorted set) key bound operations

配置后,模板是线程安全的,可以跨多个实例重用。

RedisTemplate对其大多数操作使用基于Java的序列化程序。这意味着模板写入或读取的任何对象都将通过Java序列化和反序列化。

您可以在模板上更改序列化机制,Redis模块提供了几种实现,可在org.springframework.data.Redis.serializer包中获得。有关详细信息,请参阅序列化程序。您还可以通过将enableDefaultSerializer属性设置为false,将任何序列化程序设置为null,并将RedisTemplate与原始字节数组一起使用。请注意,模板要求所有键都不为null。然而,只要底层序列化程序接受它们,值就可以为null。阅读每个序列化程序的Javadoc以了解更多信息。

对于需要特定模板视图的情况,请将视图声明为依赖项,然后注入模板。容器自动执行转换,消除opsFor[X]调用,如下例所示:

配置模板API:

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

 ‌LettuceConnectionFactory‌是Spring Data Redis中的一个类,用于创建和管理与Redis服务器的连接。它是一个连接工厂,负责创建和配置Redis连接,并提供与Redis服务器进行通信的方法

使用[Reactive]RedisTemplate将项目推送到列表:

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

二、围绕着字符串的操作

由于Redis中存储的键和值通常是java.lang.String,因此Redis模块为RedisConnection和RedisTemplate提供了两个扩展,分别是StringRedisConnectition(及其DefaultStringRedissConnection实现)和StringRedistTemplate,作为密集String操作的便捷一站式解决方案。除了绑定到String键之外,模板和连接还使用下面的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和StringRedisTemplet允许您通过RedisCallback接口直接与Redis对话。此功能为您提供了完全的控制,因为它直接与RedisConnection对话。请注意,当使用StringRedisTemplate时,回调接收StringRedissConnection的实例。下面的例子展示了如何使用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中,用户(自定义)类型和原始数据之间的转换(反之亦然)由org.springframework.Data.Redis.serializer包中的Spring Data Redis处理。

此包包含两种类型的序列化程序,顾名思义,它们负责序列化过程:

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

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

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

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

四、开发实例 

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:data:redis:host: Redis所在主机地址port: Redis对应端口号(默认6379)password: 密码lettuce:pool:max-active: 最大连接数max-wait: 等待时长max-idle: 最大空闲连接min-idle: 最小空闲连接数
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisconnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;@configuration
public class Redisconfig {@Beanpublic RedisTemplate<string, object> redisTemplate(RedisconnectionFactory connectionfactory) {RedisTemplate<string, object> template = new RedisTemplate<>();template.setconnectionFactory(connectionFactory);return template;}
}
@service
public class Userservice {@Autowiredprivate RedisTemplate<string, object> redisTemplate;public void saveUser(string userId, User user) {redisTemplate.opsForValue().set(userId, user);}public User getuser(string userId) {return (user) redisTemplate.opsForValue().get(userId);}public void deleteuser(string userId) {redisTemplate.delete(userId);}public void setuserwithExpiry(string userId, User user, long timeout) {redisTemplate.opsForValue().set(userId, user, timeout, TimeUnit.SECONDS);}
}

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

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

相关文章

WeakAuras NES Script(lua)

WeakAuras NES Script 修星脚本字符串 脚本1&#xff1a;NES !WA:2!TMZFWXX1zDxVAs4siiRKiBN4eV(sTRKZ5Z6opYbhQQSoPtsxr(K8ENSJtS50(J3D7wV3UBF7E6hgmKOXdjKsgAvZFaPTtte0mD60XdCmmecDMKruyykDcplAZiGPfWtSsag6myGuOuq89EVDV9wPvKeGBM7U99EFVVVV33VFFB8Z2TJ8azYMlZj7Ur3QDR(…

【江协STM32】11-2/3 W25Q64简介、软件SPI读写W25Q64

1. W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器&#xff0c;常应用于数据存储、字库存储、固件程序存储等场景存储介质&#xff1a;Nor Flash&#xff08;闪存&#xff09;时钟频率&#xff1a;80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)存储容…

沸点 | 聚焦嬴图Cloud V2.1:具备水平可扩展性+深度计算的云原生嬴图动力站!

近日&#xff0c;嬴图正式推出嬴图Cloud V2.1&#xff0c;此次发布专注于提供无与伦比的用户体验&#xff0c;包括具有水平可扩展性的嬴图Powerhouse的一键部署、具有灵活定制功能的管理控制台、VPC / 专用链接等&#xff0c;旨在满足用户不断变化需求的各项前沿功能&#xff0…

Elasticsearch入门学习

Elasticsearch是什么 Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。 特点 分布式&a…

重邮+数字信号处理实验六:用 MATLAB 设计 IIR 数字滤波器

一、实验目的 1、加深对 IIR 数字滤波器设计方法和设计步骤的理解&#xff1b; 2、掌握用模拟滤波器原型设计 IIR 数字滤波器的方法&#xff1b; 3、能编写 MATLAB 函数&#xff0c;掌握设计 IIR 数字滤波器的函数调用方法&#xff1b; 4、根据不同的应用场景&#xff0…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)

教程 fast-crud select示例配置需求:需求比较复杂 1. 下拉框选项需要通过后端接口获取 2. 实现多选功能 由于这个前端框架使用逻辑比较复杂我也是第一次使用,所以只记录核心问题 环境:vue3,typescript,fast-crud ,elementPlus 效果 代码 // crud.tsx文件(/.ts也行 js应…

【伪随机数】关于排序算法自测如何生成随机数而引发的……

以 Random 开始 可能一开始&#xff0c;你只是写到了排序算法如何生成随机数 public static void main(String[] args) {Random random new Random();int[] nums new int[10];for (int i 0; i < nums.length; i) {nums[i] random.nextInt(100);}System.out.println(&q…

项目概述、开发环境搭建(day01)

软件开发整体介绍 软件开发流程 第1阶段: 需求分析 需求规格说明书&#xff0c; 一般来说就是使用 Word 文档来描述当前项目的各个组成部分&#xff0c;如&#xff1a;系统定义、应用环境、功能规格、性能需求等&#xff0c;都会在文档中描述。产品原型&#xff0c;一般是通过…

1Hive概览

1Hive概览 1hive简介2hive架构3hive与Hadoop的关系4hive与传统数据库对比5hive的数据存储 1hive简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进…

Hive迁移,小表(10G以下的),分区快速修复批量脚本

hive迁移要迁移元数据&#xff08;mysql&#xff09;&#xff0c;要迁移实际数据hdfs&#xff0c;迁移完后如果有分区&#xff0c;通常是不能访问的。 这里就要修复分区了&#xff0c;如果是大表&#xff0c;几十T这种&#xff0c;迁移可能花了24小时&#xff0c;那么你修复分…

Vulnhub DC-9靶机实战

前言 这里说一下这个靶机的难点 1.这次sql注入是两个库的&#xff0c;在不使用sqlmap的情况下很多人直接database()看数据库&#xff0c;另一个库反倒没关注 2.nmap的扫描方式如果用-sT的tcp连接扫端口的话是扫不到那些被防火墙过滤的端口的&#xff0c;直接nmap ip就可以 3…

快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力

作者&#xff1a;Karthik Gopal&#xff0c;SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 无论是在出货量巨大的消费电子市场&#xff0c;还是针对特定应用的细分芯片市场&#xff0c;差异化芯片设计带来的定制化需求也在芯片…

【Git版本控制器--1】Git的基本操作--本地仓库

目录 初识git 本地仓库 认识工作区、暂存区、版本库 add操作与commit操作 master文件与commit id 修改文件 版本回退 撤销修改 删除文件 初识git Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪文件的更改&#xff0c;特别是在软件开发中。 为什么要版本…

2025宝塔API一键建站系统PHP源码

源码介绍 2025宝塔API一键建站系统PHP源码&#xff0c;对接自己的支付&#xff0c;虚拟主机也能搭建&#xff0c;小白式建站系统&#xff0c;基于宝塔面板搭建的建站系统&#xff0c;功能丰富&#xff0c;多款模板&#xff0c;每日更新 上传源码到服务器&#xff0c;浏览器访问…

在IDEA上运行Java项目

新建一个项目&#xff0c;下面创建模块&#xff0c;然后在src下新建包名&#xff0c;最后见类&#xff08;class&#xff09; 设置主题 settings>apparence 设置字体 Editor> Font 设置注释 Editor>Color Scheme>Language Defaults>Comments 设置自动导包 …

2025年01月13日Github流行趋势

1. 项目名称&#xff1a;Jobs_Applier_AI_Agent 项目地址url&#xff1a;https://github.com/feder-cr/Jobs_Applier_AI_Agent项目语言&#xff1a;Python历史star数&#xff1a;25929今日star数&#xff1a;401项目维护者&#xff1a;surapuramakhil, feder-cr, cjbbb, sarob…

DHCP、MSTP+VRRP总结实验

R1即使服务器&#xff08;给予dhcp的地址的&#xff09; [LSW1]int Eth-Trunk 12 [LSW1-Eth-Trunk12]mode manual load-balance //配置链路聚合模式为手工负载分担模式 [LSW1-Eth-Trunk12]load-balance src-dst-mac //配置基于源目IP的负载分担模式[LSW1-Eth-Trunk12]trunk p…

【ArcGIS初学】产生随机点计算混淆矩阵

混淆矩阵&#xff1a;用于比较分类结果和地表真实信息 总体精度(overall accuracy) :指对角线上所有样本的像元数(正确分类的像元数)除以所有像元数。 生产者精度(producers accuracy) &#xff1a;某类中正确分类的像元数除以参考数据中该类的像元数(列方向)&#xff0c;又称…

有一台服务器可以做哪些很酷的事情

有一台服务器可以做哪些很酷的事情 今天我也来简单分享一下&#xff0c;这几年来&#xff0c;我用云服务器做了哪些有趣的事情。 服务器推荐 1. 个人博客 拥有个人服务器&#xff0c;你可以完全掌控自己的网站或博客。 与使用第三方托管平台相比&#xff0c;你能自由选择网站…