SpringData Redis:RedisTemplate配置与数据操作

文章目录
- 引言
- 一、Redis概述与环境准备
- 二、RedisTemplate基础配置
- 三、连接属性配置
- 四、操作String类型数据
- 五、操作Hash类型数据
- 六、操作List类型数据
- 七、操作Set类型数据
- 八、操作ZSet类型数据
- 九、事务与管道操作
- 总结
引言
Redis作为高性能的NoSQL数据库,在分布式系统中扮演着重要角色。Spring Data Redis提供了简化Redis操作的强大工具,其中RedisTemplate是核心组件,为开发者提供了统一的API接口实现各种复杂的Redis数据操作。本文深入探讨RedisTemplate的配置方法及其在各种数据类型上的操作技巧,帮助开发者充分利用Redis的特性提升应用性能。
一、Redis概述与环境准备
Redis是一个开源的内存数据结构存储系统,可用作数据库、缓存和消息中间件。在Spring应用中集成Redis需要添加相关依赖,配置连接参数,创建RedisTemplate实例。Spring Data Redis的抽象使得开发者无需关注底层连接管理,专注于业务逻辑开发。Redis支持的主要数据结构包括String、List、Hash、Set和ZSet,这些都可以通过RedisTemplate进行操作。
<!-- Maven依赖配置 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.7.0</version>
</dependency><!-- 使用连接池时需要添加commons-pool2依赖 -->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version>
</dependency>
二、RedisTemplate基础配置
RedisTemplate的配置是使用Spring Data Redis的第一步。在配置时需要指定连接工厂、序列化器和各种操作超时时间。默认情况下,RedisTemplate使用JDK序列化,但这种方式效率较低且可读性差,因此在生产环境中通常自定义序列化方式,如使用JSON或ProtoBuf。合理的配置对性能和数据一致性有重要影响。
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;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate实例RedisTemplate<String, Object> template = new RedisTemplate<>();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 设置key的序列化器template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());// 设置value的序列化器GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer();template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);// 初始化RedisTemplatetemplate.afterPropertiesSet();return template;}
}
三、连接属性配置
连接参数配置决定了Redis连接的性能和可靠性。包括主机地址、端口、密码、连接超时时间等基本参数,以及连接池设置如最大连接数、最小空闲连接数、连接最大等待时间等高级选项。合理配置连接池可以显著提升性能并降低资源消耗。生产环境中还需要考虑哨兵模式或集群模式的配置以提高可用性。
# application.yml配置
spring:redis:host: localhostport: 6379password: mypassworddatabase: 0timeout: 10000ms# 连接池配置lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1ms
四、操作String类型数据
String是Redis中最基本的数据类型,可以存储字符串、整数或浮点数。RedisTemplate提供了ValueOperations接口来操作String类型的数据,支持设置值、获取值、批量操作、原子递增等功能。在高并发场景下,String类型的原子操作特性可以用于实现分布式锁、计数器等关键功能。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class RedisStringService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 设置String类型的值* @param key 键* @param value 值* @param timeout 过期时间* @param unit 时间单位*/public void setString(String key, Object value, long timeout, TimeUnit unit) {ValueOperations<String, Object> ops = redisTemplate.opsForValue();ops.set(key, value, timeout, unit);}/*** 获取String类型的值* @param key 键* @return 值*/public Object getString(String key) {ValueOperations<String, Object> ops = redisTemplate.opsForValue();return ops.get(key);}/*** 递增操作* @param key 键* @param delta 增量* @return 增加后的值*/public Long increment(String key, long delta) {ValueOperations<String, Object> ops = redisTemplate.opsForValue();return ops.increment(key, delta);}
}
五、操作Hash类型数据
Hash类型适合存储对象,每个Hash可以存储多个键值对。RedisTemplate提供了HashOperations接口操作Hash数据,支持获取单个字段值、多个字段值、设置字段值、删除字段等操作。Hash类型适合存储用户信息、商品属性等数据,相比于将整个对象序列化存储为String,Hash更节省空间且支持针对特定字段的操作。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.Map;@Service
public class RedisHashService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 设置Hash的多个字段值* @param key Redis键* @param map 多个键值对*/public void putAll(String key, Map<String, Object> map) {HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();hashOps.putAll(key, map);}/*** 获取Hash的所有字段和值* @param key Redis键* @return 所有键值对*/public Map<String, Object> entries(String key) {HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();return hashOps.entries(key);}/*** 获取Hash中特定字段的值* @param key Redis键* @param hashKey Hash的字段* @return 字段的值*/public Object get(String key, String hashKey) {HashOperations<String, String, Object> hashOps = redisTemplate.opsForHash();return hashOps.get(key, hashKey);}
}
六、操作List类型数据
List类型是一个按插入顺序排序的字符串链表。RedisTemplate提供了ListOperations接口操作List数据,支持从两端添加元素、获取指定范围元素、移除元素等功能。List适合实现消息队列、最新数据列表等功能,其左进右出或右进左出的特性使其成为FIFO队列的理想选择。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class RedisListService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 将元素添加到List的左侧* @param key Redis键* @param value 要添加的值* @return 添加后的List长度*/public Long leftPush(String key, Object value) {ListOperations<String, Object> listOps = redisTemplate.opsForList();return listOps.leftPush(key, value);}/*** 从List的右侧弹出一个元素* @param key Redis键* @return 弹出的元素*/public Object rightPop(String key) {ListOperations<String, Object> listOps = redisTemplate.opsForList();return listOps.rightPop(key);}/*** 获取List指定范围的元素* @param key Redis键* @param start 开始索引* @param end 结束索引* @return 元素列表*/public List<Object> range(String key, long start, long end) {ListOperations<String, Object> listOps = redisTemplate.opsForList();return listOps.range(key, start, end);}
}
七、操作Set类型数据
Set是无序的字符串集合,元素不允许重复。RedisTemplate提供了SetOperations接口操作Set数据,支持添加元素、删除元素、获取所有元素、判断元素是否存在等功能。Set的交集、并集、差集运算使其适合实现标签系统、好友关系、共同兴趣等功能,在社交网络应用中有广泛用途。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.stereotype.Service;import java.util.Set;@Service
public class RedisSetService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 向Set中添加元素* @param key Redis键* @param values 要添加的元素* @return 添加成功的数量*/public Long add(String key, Object... values) {SetOperations<String, Object> setOps = redisTemplate.opsForSet();return setOps.add(key, values);}/*** 获取Set中的所有元素* @param key Redis键* @return 元素集合*/public Set<Object> members(String key) {SetOperations<String, Object> setOps = redisTemplate.opsForSet();return setOps.members(key);}/*** 计算两个Set的交集* @param key1 第一个Set的键* @param key2 第二个Set的键* @return 交集元素*/public Set<Object> intersect(String key1, String key2) {SetOperations<String, Object> setOps = redisTemplate.opsForSet();return setOps.intersect(key1, key2);}
}
八、操作ZSet类型数据
ZSet(有序集合)是一种元素带有分数的Set,元素按分数排序。RedisTemplate提供了ZSetOperations接口操作ZSet数据,支持添加元素、获取指定分数范围的元素、按分数或位置获取元素等功能。ZSet适合实现排行榜、优先级队列等业务场景,其按分数范围查询的高效性是其独特优势。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;import java.util.Set;@Service
public class RedisZSetService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 向ZSet添加元素* @param key Redis键* @param value 元素值* @param score 分数* @return 添加成功返回true*/public Boolean add(String key, Object value, double score) {ZSetOperations<String, Object> zSetOps = redisTemplate.opsForZSet();return zSetOps.add(key, value, score);}/*** 获取指定分数范围的元素(按分数从高到低排序)* @param key Redis键* @param min 最小分数* @param max 最大分数* @return 元素集合*/public Set<Object> reverseRangeByScore(String key, double min, double max) {ZSetOperations<String, Object> zSetOps = redisTemplate.opsForZSet();return zSetOps.reverseRangeByScore(key, min, max);}/*** 获取元素的排名(从0开始,按分数从高到低)* @param key Redis键* @param value 元素值* @return 排名*/public Long reverseRank(String key, Object value) {ZSetOperations<String, Object> zSetOps = redisTemplate.opsForZSet();return zSetOps.reverseRank(key, value);}
}
九、事务与管道操作
Redis事务和管道是提升性能的重要技术。事务通过multi、exec命令将多个操作打包成原子执行的单元,保证操作的一致性。管道则将多个命令批量发送到服务器,减少网络往返次数。RedisTemplate提供了multi()方法开启事务和executePipelined()方法执行管道操作。在大批量数据处理场景中,使用管道可以显著提升性能。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class RedisTransactionService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 使用事务执行多个操作* @return 事务执行结果*/public List<Object> executeTransaction() {return redisTemplate.execute(new SessionCallback<List<Object>>() {@Overridepublic List<Object> execute(RedisOperations operations) throws DataAccessException {// 开启事务operations.multi();// 执行多个操作operations.opsForValue().set("tx:key1", "value1");operations.opsForValue().set("tx:key2", "value2");operations.opsForHash().put("tx:hash", "field1", "value1");// 提交事务return operations.exec();}});}/*** 使用管道执行多个操作* @return 管道执行结果*/public List<Object> executePipeline() {return redisTemplate.executePipelined(new SessionCallback<Object>() {@Overridepublic Object execute(RedisOperations operations) throws DataAccessException {// 执行多个操作operations.opsForValue().set("pipe:key1", "value1");operations.opsForValue().set("pipe:key2", "value2");operations.opsForValue().get("pipe:key1");operations.opsForHash().put("pipe:hash", "field1", "value1");// 管道中不需要返回值return null;}});}
}
总结
Spring Data Redis通过RedisTemplate为Java应用提供了强大的Redis操作能力,使开发者能够轻松集成和利用Redis的高性能特性。本文详细介绍了RedisTemplate的配置方法和各种数据类型的操作技巧,包括String、Hash、List、Set和ZSet等核心数据结构的处理方式。通过合理配置序列化器和连接参数,可以显著提升Redis操作的性能。事务和管道操作则提供了处理大批量数据的高效手段。在实际应用中,开发者应根据业务需求选择合适的数据结构和操作方式,充分发挥Redis的强大功能。掌握RedisTemplate的各种操作方法,将帮助开发者构建高性能、可扩展的分布式系统。
相关文章:
SpringData Redis:RedisTemplate配置与数据操作
文章目录 引言一、Redis概述与环境准备二、RedisTemplate基础配置三、连接属性配置四、操作String类型数据五、操作Hash类型数据六、操作List类型数据七、操作Set类型数据八、操作ZSet类型数据九、事务与管道操作总结 引言 Redis作为高性能的NoSQL数据库,在分布式系…...
Qt按钮控件常用的API
1.创建按钮 QPushButton *btnnew QPushButton; 以顶层方式弹出窗口控件 代码: #include "widget.h" #include "ui_widget.h" #include"QPushButton"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&…...
如何检查CMS建站系统的插件是否安全?
检查好CMS建站系统的插件安全是确保网站安全的重要环节,对于常见的安全检查,大家可以利用以下几种有效的方法和工具,来帮你评估插件的安全性。 1. 检查插件来源和开发者信誉 选择可信来源:仅从官方插件库或可信的第三方开发者处…...
修改HuggingFace模型默认缓存路径
huggingface模型的默认缓存路径是~/.cache/huggingface/hub/ 通常修改为自己的路径会更为方便。 方式一:cache_dir 参数 可以通过from_pretrained函数中的 cache_dir 参数来指定,缺点,每次都需要手动指定,比较麻烦。 如&#x…...
ORA-12541: TNS:no listener
问题描述:使用 PL/SQL Developer 连接数据库时出现ORA-12541错误。 1.查询监听状态 [oraclelocalhost admin]$ lsnrctl statusLSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-MAR-2025 10:47:57Copyright (c) 1991, 2021, Oracle. All rights reserv…...
【Matlab GUI】封装matlab GUI为exe文件
注:封装后的exe还是需要有matlab环境才能运行 (1)安装MCRinstaller.exe文件,在matlab安装目录下的toolbox/compiler/deploy/win64文件夹里 (2)安装完MCRinstaller.exe,字命令窗口输入&#x…...
【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发
在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上,将隧道转发改成直接转发 一、改成直接转发需要改动的配置 (一)将连接AP的接口改成trunk口,并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …...
Redis能否替代MySQL作为主数据库?深入解析两者的持久化差异与适用边界——基于AOF持久化与关系型数据库的对比
一、Redis的持久化机制与可靠性分析 AOF持久化原理与策略 Redis的AOF(Append Only File)通过记录所有写操作命令实现持久化,支持三种策略: **always模式**:每条命令执行后立即同步到磁盘,理论上数据丢失…...
机器人ROS学习:Ubuntu22.04安装ROS2和Moveit2实现运动规划
通过本篇文章学习,你可以收获以下内容: 学会在 Ubuntu22.04 上安装 Moveit2学会下载编译运行 Moveit2 样例程序学会使用样例程序进行运动规划等 版本平台 系统版本:ubuntu22.04ROS2 版本:humbleMoveit 版本:moveit2…...
GIT标签(Tag)操作
在Git中,标签(Tag)用于标记特定的提交点,通常用于发布版本。 切换到需要打标签的分支: git checkout <branch-name>创建标签 git tag v1.0.0 git tag -a v1.0.0 -m "Release version 1.0.0"查看所…...
生成式AI红队测试:如何有效评估大语言模型
OWASP最新指南为组建生成式AI红队或调整现有红队以适应新技术提供了详细的指导。 红队测试是一种经过时间检验的网络安全系统测试和加固方法,但它需要不断适应技术的演变。近年来,生成式AI和大语言模型(LLM)的爆发,是…...
技术路线图ppt模板_流程图ppt图表_PPT架构图
技术路线图ppt模板 / 学术ppt模板 - 院士增选、国家科技奖、杰青、长江学者特聘教授、校企联聘教授、重点研发、优青、青长、青拔.. / 学术ppt案例 WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 - 科学技术奖ppt:自然科学奖 | 技术…...
Leetcode-131.Palindrome Partitioning [C++][Java]
目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-131.Palindrome Partitioninghttps://leetcode.com/problems/palindrome-partitioning/description/131. 分割回文串 - 力扣(LeetCode)131. 分割回文串 - 给你一个字符串 s,请你…...
LeetCode 解题思路 20(Hot 100)
解题思路: 递归定义对称性: 若两棵子树镜像对称,需满足: 当前节点值相等;左子树的左节点与右子树的右节点对称;左子树的右节点与右子树的左节点对称。 终止条件: 两个节点均为空 → 对称&am…...
挖矿------获取以太坊测试币
文章目录 挖矿------获取以太坊测试币通过水龙头获取以太坊测试币了解Sepolia是什么?水龙头(Faucet)是什么?Gitcoin Passport是什么? 操作1.MetaMask钱包2.将MetaMask切换到Sepolia测试网络3.用MetaMask连接Gitcoin Pa…...
每天五分钟深度学习框架pytorch:基于pytorch搭建循环神经网络RNN
本文重点 我们前面介绍了循环神经网络RNN,主要分析了它的维度信息,其实它的维度信息是最重要的,一旦我们把维度弄清楚了,一起就很简单了,本文我们正式的来学习一下,如何使用pytorch搭建循环神经网络RNN。 RNN的搭建 在pytorch中我们使用nn.RNN()就可以创建出RNN神经网络…...
XEasyWork:面向AI应用的可视化工作流开发平台
文章目录 前言 一、平台核心价值 1.1产品定位 1.2 技术优势 二、技术架构解析 2.1战略级整合 自主开发模块 2.2集成开源项目 三、体验地址 三、未来规划 总结 前言 在人工智能技术快速落地的今天,开发者在构建AI应用时仍面临两大挑战:技术栈复杂带来的高…...
C#进阶(多线程相关)
1。进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,【是系统进行资源分配的基本单位】,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体…...
【C++】:C++11详解 —— 右值引用
目录 左值和右值 左值的概念 右值的概念 左值 vs 右值 左值引用 和 右值引用 左值引用 右值引用 左值引用 vs 右值引用 使用场景 左值引用的使用场景 左值引用的短板 右值引用的使用场景 1. 实现移动语义(资源高效转移) 2. 优化容器操作&a…...
【css酷炫效果】纯CSS实现虫洞穿越效果
【css酷炫效果】纯CSS实现穿越效果 缘创作背景html结构css样式完整代码基础版进阶版(虫洞穿越) 效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90491973 缘 创作随缘,不定时…...
Linux IP 配置
Linux IP 配置 1 环境介绍2 网卡信息配置3 使用nmtui工具配置4 更多Linux命令学习使用列表 1 环境介绍 虚拟机,服务器安装系统完成后,先要配置ip 地址,这样可以方便远程若是物理服务器一般会有4个网卡信息麒麟v10,CentOS7&#x…...
设计模式之装饰器模式:原理、实现与应用
引言 装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许你通过将对象放入包含行为的特殊封装对象中来为原对象动态添加新的行为。装饰器模式提供了一种灵活的替代方案,避免了通过继承扩展功能的局限性。本文将深入探讨装…...
c语言笔记 结构体基础
目录 基础知识 结构体定义 基础知识 在c语言中变量是有类型的,比如整型,char型,浮点型等,这些都是单一的类型,那么如果说我要定义一个学生的信息,那么这些单一的类型是不足以表达一个学生的全部信息&#…...
Vue 登录 记住密码,设置存储时间
Vue 登录 记住密码,设置存储时间 一、手动存储login.vue 二、使用vue-cookies插件main.jslogin.vue 一、手动存储 login.vue 提示: // 设置cookie方法 setCookie(loginName, password, days) {let text encryptDes(password, des123)//使用des方法加…...
C++ 学习笔记(三)—— 入门+类和对象
1、内联函数(inline) 内联函数主要是解决C语言的宏的缺陷提出来的; 宏的缺陷: 1)容易出错,语法坑很多; 2)不能调试; 3)没有类型安全的检查; 宏的…...
KVM安全模块生产环境配置与优化指南
KVM安全模块生产环境配置与优化指南 一、引言 在当今复杂多变的网络安全环境下,生产环境中KVM(Kernel-based Virtual Machine)的安全配置显得尤为重要。本指南旨在详细阐述KVM安全模块的配置方法,结合强制访问控制(M…...
基于 SSE 和 WebSocket 的在线文本实时传输工具
简介 在线文本实时传输工具支持 SSE(Server-Sent Events) 和 WebSocket,可在不同设备间快速共享和同步文本,适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步:文本输入后,另一端用户可立即看到…...
数图亮相第三届全国生鲜创新峰会,赋能生鲜零售数字化转型
2025年3月15-18日,第三届全国生鲜创新峰会在湖北宜昌召开,主题为“生鲜破局,重塑价值”。峰会汇聚行业专家、企业领袖及精英,探讨生鲜零售新机遇与挑战。作为领先的“智慧零售”服务商,数图信息科技受邀出席࿰…...
go 安装swagger
1、依赖安装: # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入: swag -v 3、…...
CH347使用笔记:CH347结合STM32CubeIDE实现单片机下载与调试
目录 基于 STM32CubeIDE的 CH347 JTAG/SWD调试器使用说明1. CH347驱动安装与配置2. STM32CubeIDE调试器配置2.1 打开相关工程后,进行以下操作2.2 openocd.exe替换2.3 脚本添加2.4 更改调试器选择 3. 下载程序4. 使用过程中可能遇到的问题4.1 CH347未插入4.2 Openocd…...
