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 栏目,希望帮助社…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
