SpringData-Redis缓存之RedisTemplate
一、概述
大多数用户可能会使用RedisTemplate及其相应的包org.springframework.data.redis.core或其反应式变体ReactiveRedisTemplate。由于其丰富的功能集,该模板实际上是Redis模块的中心类。该模板为Redis交互提供了高级抽象。虽然[Reactive]RedisConnection提供了接受和返回二进制值(字节数组)的低级方法,但模板负责序列化和连接管理,使用户无需处理此类细节。
RedisTemplate类实现RedisOperations接口,其反应变量ReactiveRedisTemplate实现ReactiveEdisOperations。
此外,该模板还提供了操作视图(遵循Redis命令参考中的分组),这些视图提供了丰富的通用接口,用于处理特定类型或特定键(通过KeyBound接口),如下表所述:
操作视图:
Interface | Description |
---|---|
Key Type Operations | |
GeoOperations | Redis geospatial operations, such as |
HashOperations | Redis hash operations |
HyperLogLogOperations | Redis HyperLogLog operations, such as |
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);}
}
相关文章:
SpringData-Redis缓存之RedisTemplate
一、概述 大多数用户可能会使用RedisTemplate及其相应的包org.springframework.data.redis.core或其反应式变体ReactiveRedisTemplate。由于其丰富的功能集,该模板实际上是Redis模块的中心类。该模板为Redis交互提供了高级抽象。虽然[Reactive]RedisConnection提供…...

第423场周赛:检测相邻递增子数组 Ⅰ、检测相邻递增子数组 Ⅱ、好子序列的元素之和、统计小于 N 的 K 可约简整数
Q1、检测相邻递增子数组 Ⅰ 1、题目描述 给你一个由 n 个整数组成的数组 nums 和一个整数 k,请你确定是否存在 两个 相邻 且长度为 k 的 严格递增 子数组。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,并满足下…...
hive知识体系
hive知识体系 hive知识体系 链接: 1Hive概览 链接: 2Hive表类型 链接: 3Hive数据抽样 链接: 4Hive计算引擎 链接: 5Hive存储与压缩 链接: 6Hive Sql 大全 链接: 6Hive Sql 大全-Hive 函数 链接: 6Hive Sql 大全-窗口函数 链接: 7Hive执行计划 链接: 8Hive SQL底层执行原理 链接…...

第三篇 Avaya IP Office的架构及其服务组成
所谓的架构,其实就是Solution,解决方案。一般就是如下几套: IPO primary IPO secondaryIPO primary IP500v2IPO primary IPO secondary IP500v2IPO primary IPO secondary IP500v2 Expansion Server(IP500v2,扩展)IPO primaryIPO 500v2 简单的解释…...

AUTOSAR EcuM(ECU状态管理器)
EcuM管理的ECU状态特指ECU的上下电状态。EcuM有两种EcuMFixed和EcuMFlex,其中EcuMFlex是在 AUTOSAR4.x 之后新增的规范文件,相应地原来的 EcuM 改称为 EcuMFixed。EcuMFlex主要是为了适应不同应用场景的各种不同需求,实现更加灵活的处理。所以…...

【PyQt】如何在mainwindow中添加菜单栏
[toc]如何在mainwindow中添加菜单栏 如何在mainwindow中添加菜单栏 主要有两种方法: 1.直接创建mainwindow进行添加 2.使用ui文件加载添加 第二种方法更为常见,可以应用到实际 1.直接创建mainwindow进行添加 import sysfrom PyQt5.QtWidgets import …...

浅谈云计算01 | 云计算服务的特点
在当今数字化时代,云计算作为一种强大的技术解决方案,正逐渐改变着企业和个人对信息技术的使用方式。本文将详细探讨云计算的五个主要特点,包括按需自助服务、广泛的网络接入、资源池化、快速弹性伸缩以及可计量服务。 一、按需自助服务 云…...

【开题报告】基于springboot的煤矿安全监测系统的设计与实现
【开题报告】基于springboot的煤矿安全监测系统的设计与实现 1.选题背景、研究目的及意义 1.1选题背景 煤炭是我国能源行业的重要组成部分,对国民经济具有支撑和推动作用。在煤炭生产过程中存在较高的安全风险,煤矿事故频发,这不仅对人员生…...
微服务中引入消息队列的利弊
微服务中引入消息队列的利弊 1、微服务架构中引入消息队列(Message Queue)的主要优势: 1.1 解耦(Decoupling) 服务之间不需要直接调用,通过消息队列实现松耦合 生产者和消费者可以独立扩展和维护 降低系统间的依赖性 1.2 异步处理(Asynchronous Proc…...
Redis缓存穿透、缓存雪崩和缓存击穿
一、缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存…...
EF Core分页
Skip(3).Take(8) 最好显式指定排序规则需要知道满足条件的数据的总条数: 用IQueryable的复用 LongCount和Count页数:long pageCount (long)Math.Ceiling(count * 1.0 / pageSize); class Program {static async Task Main(string[] args){using (MyDbC…...

高效设计新选择!用StartAI打造各种风格主题的平铺素材图!
想要打造独特的POD(Print on Demand,按需打印)平铺素材图,却又苦于设计效率低下?别急,今天我来给大家分享一个高效方法,让你轻松秒制各种风格的POD平铺素材图! 具体操作步骤 打开ps…...

大数据技术Kafka详解 ⑤ | Kafka中的CAP机制
目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达600多个,欢迎订阅,持续更新…...

qml Emitter 详解
1、概述 Emitter是QML粒子系统中的一个关键组件,用于创建并发射逻辑粒子。这些逻辑粒子本身不会自动渲染,需要使用一个或多个ParticlePainter元素(如ImageParticle、ItemParticle等)来进行可视化显示。Emitter通过定义粒子的发射…...

【Docker】保姆级 docker 容器部署 MySQL 及 Navicat 远程连接
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. docker 容器部署 MySQL1.1 拉取mysql镜像1.2 启动容器1.3 进入容器1.4 使用 root 用户登录 2. Navicat 连…...

mybatis-spring @MapperScan走读分析
接上一篇文章:https://blog.csdn.net/qq_26437925/article/details/145100531, 本文注解分析mybatis-spring中的MapperScan注解,则将容易许多。 目录 MapperScan注解定义ConfigurationClassPostProcessor扫描注册beanDefinitionorg.mybatis.s…...

Mysql--架构篇--体系结构(连接层,SQL层,存储引擎层,文件存储层)
MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),其体系结构设计旨在提供高效的数据存储、查询处理和事务管理。MySQL的体系结构可以分为多个层次,每个层次负责不同的功能模块。 MySQL的体系结构主要由以下几个部分组成&#…...

【0x005B】HCI_Write_Default_Erroneous_Data_Reporting命令详解
目录 一、命令概述 二、命令格式及参数 2.1. HCI_Write_Default_Erroneous_Data_Reporting命令格式 2.2. Erroneous_Data_Reporting 三、生成事件及参数 3.1. HCI_Command_Complete事件 3.2. 状态码(Status) 四、命令执行流程 4.1. 命令发起阶段(主机端) 4.2. 命…...
基于 Python 的学生成绩管理系统设计与实现
标题:基于 Python 的学生成绩管理系统设计与实现 内容:1.摘要 摘要:本文介绍了一个基于 Python 的学生成绩管理系统的设计与实现。该系统旨在提高学生成绩管理的效率和准确性,方便教师和学生进行成绩查询和分析。本文详细描述了系统的设计思路、功能模块…...

【Apache Doris】周FAQ集锦:第 29 期
引言 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。 通过这个每周 FAQ 栏目,希望帮助社…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...