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的各种操作方法,将帮助开发者构建高性能、可扩展的分布式系统。

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

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

相关文章

串口烧录出现频繁回复乱码 频繁回复一个数字且烧录失败 字节混乱

这是因为你的芯片没有处于系统存储区启动一直未进入bootloader 解决办法是检查boot引脚接正确没&#xff0c;要在系统存储器启动

共享经济再中介化进程中的技术创新与模式重构研究——以“开源AI智能名片链动2+1模式S2B2C商城小程序“为例

摘要 本文基于共享经济中介化演进的双重逻辑&#xff0c;通过案例研究与技术解构&#xff0c;探讨"开源AI智能名片链动21分销机制S2B2C商城小程序"集成系统如何重构数字经济时代的价值网络。研究发现&#xff0c;该技术生态通过三维需求匹配、动态价值分配与智能风险…

【linux】虚拟机执行sudo yum isntall perl报错 could not retrieve mirrorlist htt:

项目场景&#xff1a; 提示&#xff1a;虚拟机安装拓展包&#xff0c;sudo yum install perl Virtualbox 在不安装增强功能扩展的情况下, 无法自适应分辨率和共享剪切板等操作 问题描述 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; 出现这个错误是因…

网络编程知识预备阶段

1. OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时&#xff0c;更好地理解和…

我的Gitee

算法与数据结构: 浙海大小趴菜的一些记录 后续也会更新一些项目&#xff0c;小趴菜以后也会变得很厉害

Collection合集(单列集合)

Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含一个值。Collection实际上是一个泛型接口 Collection集合常用API&#xff1a; 代码实现&#xff1a; Collection集合遍历 遍历方式一&#xff1a;迭代器 迭代器是用来遍历集合的专用方式&#…

旅游类小程序界面设计

产品概述 艾啦游是一款互联网旅游类小程序&#xff0c;致力于国内精品旅游&#xff0c;以及拥有自由行、专属热榜单、出行攻略等诸多功能&#xff0c;汇聚了许多国内的人气景点&#xff0c;与诸多城市的酒店也保持合作&#xff0c;打造一体式旅行服务&#xff0c;更有不断上新…

移动端开发基础与常见布局

一、移动端基础 1.浏览器现状 ⑴.PC端常见浏览器 360浏览器、谷歌浏览器、火狐浏览器、QQ浏览 器、百度浏览器、搜狗浏览器、IE浏览器。 ⑵.移动端常见浏览器 UC浏览器&#xff0c;QQ浏览器&#xff0c;欧朋浏览器&#xff0c; 百度手机浏览器&#xff0c;360安全浏览器&am…

[算法] 贪心--矩阵消除游戏

文章目录 1. 题意2. 思路贪心思路1思路1并不正确思路1为什么是错误的?这道题该如何求解?枚举思路是超时的!枚举 贪心 3. 编码 今天咱们来分享一道基础的贪心题目 -> 矩阵消除游戏 对于贪心算法的题目, 我感觉是对于初学者没必要太注重证明过程, 因为这玩意的变数比较大, …

数学——A. K-divisible Sum + D. Exam in MAC

A. K-divisible Sum 题目&#xff1a; 思路&#xff1a; 以下 “[xxx]” 符号均代表向上取整 我们假设总和是sum&#xff0c;那么就有sum k * cnt 要想最大值最小&#xff0c;肯定是要让sum尽可能小&#xff0c;这样每个元素都能变小 最小情况是 sum 恰好等于 n 时&#…

Docker 》》Docker Compose 》》network 网络 compose

docker 默认的网络 三种模式 # 列出所有当前主机上或Swarm集群上的网络 docker network ls#查看网络详情 docker network inspect network名称# 清除未使用的docker网络 docker network prune -f# 创建网络 ocker network create -d bridge 网络名称 docker network create –s…

RabbitMQ延迟消息

文章目录 延迟消息死信交换机延迟消息延迟消息应用场景 延迟消息 生产者在发送消息的时候指定一个时间&#xff0c;消费者不会立即收到该消息&#xff0c;而是在指定时间之后才收到消息&#xff0c;这就是延迟消息。 比如说这么一个场景&#xff0c;用户下单后将商品库存进行…

phpstudy+phpstorm+xdebug【学习笔记】

配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接&#xff1a;&#xff1a;https://blog.csdn.net/m0_60571842/article/details/133246064

58.Harmonyos NEXT 图片预览组件架构设计与实现原理

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; Harmonyos NEXT 图片预览组件架构设计与实现原理 文章目录 Harmonyos NEXT 图片预览组件架构设计与实现原理效果预览一、组件架构概述1. 核心组件层…

Android 手机启动过程

梳理 为了梳理思路&#xff0c;笔者画了一幅关于 Android 手机启动的过程图片内容纯属个人见解&#xff0c;如有错误&#xff0c;欢迎各位指正

Chat-TTS-UI:文字转语音 - 本地部署方案

Chat-TTS-UI 是一个基于 ChatTTS 模型的本地网页界面,专为满足用户在信息过载时代轻松获取大量文字信息的需求而设计。它支持中英文混合输入、多种音色选择,并提供 API 接口,方便开发者集成到其他应用中。其简洁易用的网页界面、细粒度控制以及 GPU 加速等高级功能,使其广泛…

11. Pandas :操作Excel文件(Excel报表的案例研究)

从一个装有各种 Excel 文件的文件夹开始&#xff0c;这些文件需要被整合到 Excel 报表中。 它们包含了虚构的电信运营商在全美各营业厅的套餐&#xff08;金、银、铜&#xff09;销售情况。每个月有两个文件&#xff0c;子文件夹 new 中的是新用户&#xff0c;子文件夹 existin…

一周学会Flask3 Python Web开发-SQLAlchemy添加数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy提供session.add()方法添加model实体数据&#xff0c;以及提供session.commit()提交事务。 首先list.html加一个添…

大型语言模型与强化学习的融合:迈向通用人工智能的新范式——基于基础复现的实验平台构建

1. 引言 大型语言模型&#xff08;LLM&#xff09;在自然语言处理领域的突破&#xff0c;展现了强大的知识存储、推理和生成能力&#xff0c;为人工智能带来了新的可能性。强化学习&#xff08;RL&#xff09;作为一种通过与环境交互学习最优策略的方法&#xff0c;在智能体训…

Axure大屏可视化原型模板及素材:数据可视化的高效解决方案

数据可视化已成为企业决策、运营分析、市场洞察的重要工具。数据可视化大屏&#xff0c;作为数据展示和交互的直观平台&#xff0c;能够实时呈现关键数据&#xff0c;帮助企业快速做出决策。Axure作为原型设计领域的领先工具&#xff0c;以其丰富的组件库、强大的交互设计能力和…