Spring Data Redis的基本使用

目录

一、简介

二、环境搭建

三、RedisTemplate

四、序列化配置

一、简介

Spring Data Redis 是 Spring 提供的用于简化与 Redis 交互的子项目,封装了 Redis 的底层操作,提供了统一的模板和 Repository 支持,方便开发者使用面向对象的方式操作 Redis。

使用 Spring Data Redis,可以:

  • 轻松地与 Redis 进行数据交互,包括字符串、哈希、列表、集合、有序集合等数据类型。
  • 支持基于注解的缓存机制,与 Spring Cache 整合。
  • 提供了事务支持、发布/订阅(Pub/Sub)、Lua 脚本执行等高级特性。
  • 支持多种 Redis 客户端连接器,如 Lettuce(默认)和 Jedis

二、环境搭建

1. 添加依赖

在使用 Spring Boot 开发时,只需在 pom.xml 中添加 spring-boot-starter-data-redis 依赖即可:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

**注意:**默认情况下使用 Lettuce 作为 Redis 客户端,如果需要使用 Jedis,需要额外添加依赖并进行配置。

2. 配置 Redis 连接

application.yml 中配置 Redis 的连接信息:

spring:redis:host: localhostport: 6379password: yourpassword  # 如果没有密码,可不配置database: 0

三、RedisTemplate

1. 简介

RedisTemplate 是 Spring Data Redis 提供的核心模板类,用于执行 Redis 的各种操作。它支持所有的 Redis 数据类型,并提供了一系列的便捷方法。

2. 注入 RedisTemplate

Spring Boot 自动配置了 RedisTemplate,可以直接在代码中注入使用。

@Service
public class RedisService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 业务方法
}

**注意:**默认情况下,RedisTemplate 的键(Key)和值(Value)都使用 java.io.Serializable 进行序列化。如果需要使用其他序列化方式,需要进行配置。

3. 常用操作

String 操作
// 设置键值对
redisTemplate.opsForValue().set("name", "张三");// 获取值
String name = (String) redisTemplate.opsForValue().get("name");// 设置键的过期时间
redisTemplate.opsForValue().set("session:123", "userData", 30, TimeUnit.MINUTES);// 增加数值
redisTemplate.opsForValue().increment("counter", 1);// 删除键
redisTemplate.delete("name");
Hash 操作
// 设置哈希字段
redisTemplate.opsForHash().put("user:1001", "username", "lisi");
redisTemplate.opsForHash().put("user:1001", "email", "lisi@example.com");// 获取哈希字段
Object username = redisTemplate.opsForHash().get("user:1001", "username");// 获取整个哈希
Map<Object, Object> userMap = redisTemplate.opsForHash().entries("user:1001");// 删除哈希字段
redisTemplate.opsForHash().delete("user:1001", "email");
List 操作
// 左侧压入列表
redisTemplate.opsForList().leftPush("tasks", "task1");
redisTemplate.opsForList().leftPush("tasks", "task2");// 获取列表元素
List<Object> tasks = redisTemplate.opsForList().range("tasks", 0, -1);// 弹出列表元素
Object task = redisTemplate.opsForList().leftPop("tasks");
Set 操作
// 添加成员到集合
redisTemplate.opsForSet().add("online_users", "user1", "user2");// 获取集合成员
Set<Object> onlineUsers = redisTemplate.opsForSet().members("online_users");// 判断成员是否存在
boolean isMember = redisTemplate.opsForSet().isMember("online_users", "user1");
ZSet 操作
// 添加成员到有序集合
redisTemplate.opsForZSet().add("leaderboard", "player1", 100);
redisTemplate.opsForZSet().add("leaderboard", "player2", 200);// 获取有序集合成员
Set<Object> topPlayers = redisTemplate.opsForZSet().reverseRange("leaderboard", 0, -1);

4. StringRedisTemplate

StringRedisTemplateRedisTemplate 的子类,专门用于操作字符串类型的数据,默认采用 StringRedisSerializer 进行序列化。

@Service
public class StringRedisService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;public void demo() {// 设置字符串stringRedisTemplate.opsForValue().set("city", "北京");// 获取字符串String city = stringRedisTemplate.opsForValue().get("city");}
}

四、序列化配置

默认情况下,RedisTemplate 使用 JdkSerializationRedisSerializer 进行序列化,这会导致存储的键和值不可读。为了方便查看和调试,可以修改序列化方式:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);// 使用 StringRedisSerializer 序列化键StringRedisSerializer stringSerializer = new StringRedisSerializer();template.setKeySerializer(stringSerializer);template.setHashKeySerializer(stringSerializer);// 使用 Jackson2JsonRedisSerializer 序列化值Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);template.setValueSerializer(jsonSerializer);template.setHashValueSerializer(jsonSerializer);template.afterPropertiesSet();return template;}
}

说明:

  • 键和哈希键使用 StringRedisSerializer,值和哈希值使用 Jackson2JsonRedisSerializer
  • 这样配置后,Redis 中存储的键和值都是可读的字符串或 JSON。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

U3D游戏开发之骨骼动画相关

目录 1 作为U3D程序如何制作骨骼动画 2 骨骼动画程序代码相关 这个内容我在很久之前就想写了&#xff0c;很多项目也与骨骼动画挂钩&#xff0c;今天我们揭秘的是2D骨骼动画。来聊一聊大家可能非常关注的两个问题&#xff1a;作为程序如何制作骨骼动画&#xff1f;接到美术的骨…

java:题目:用Java实现简单的自取取款操作

import java.util.Scanner; public class ATM {public static void main(String[] args){//自主取款主类Scanner scnew Scanner(System.in);System.out.println("请输入账户号码&#xff1a;");String BankAccoutsrsc.nextLine();/BankAccout3 newBankAccoutnew Bank…

VLAN 高级技术 ——QinQ的配置

QinQ的概述&#xff1a; QinQ技术是一种扩展虚拟局域网&#xff08;VLAN&#xff09;数量空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来实现。以下是对QinQ技术的详细概述&#xff1a; QinQ技术的定义与背景 定义&#xff1a;QinQ&#xff08…

不得不承认供电公司信息宣传向媒体投稿的好方法找到了

初入国网供电公司,我被分配到了信息宣传部门,负责每月的信息宣传投稿任务。这项任务看似简单,实则充满挑战。一开始,我满怀热情,以为只要写出高质量的文章,就能顺利发表。然而,现实给了我当头一棒。传统的邮箱投稿方式,不仅竞争压力大,审核严格,而且周期漫长。每次投稿后,我总是…

『YOLOV5』| 一文搞定训练过程中的意外终止、以及想继续增加训练轮数!

文章目录 情况一&#xff1a;意外训练中断&#xff08;程序未训练完成&#xff0c;想完成目标训练轮数&#xff09;情况二&#xff1a;自动训练完成&#xff08;程序已完成训练&#xff0c;想增加训练轮数&#xff09; 情况一&#xff1a;意外训练中断&#xff08;程序未训练完…

GCC编译器的`-Wall`、`-Wextra`和`-pedantic`选项解读

gcc是广泛使用的开源编译器&#xff0c;-Wall、-Wextra和-pedantic是gcc中用于控制警告信息的选项&#xff0c;以下是详细介绍&#xff1a; -Wall&#xff08;启用大部分警告&#xff09; 功能&#xff1a;-Wall 选项用于启用一系列常用的警告信息&#xff0c;这些警告能帮助…

MMBench-Video:上海 AI Lab 联合多所高校推出长视频理解基准测试工具,全面评估 LVLMs 视频理解的能力

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

高频电子线路---调角频谱与频宽

目录 调角频谱(FM单频调制) 带宽 调频方法 直接调频方法与电路 变容二极管 如何提升频偏? 1. 增大调制信号的幅度&#xff08;增大调制深度&#xff09; 2. 提高调制信号的频率 3. 提高调制深度&#xff08;调制指数&#xff09; 4. 增加发射功率 5. 使用特殊的调制…

摘要、数字签名、对称加密、非对称加密综合应用示例以及技术原理说明

图&#xff1a;介绍了数字信封的安全传输过程 关键术语 散列&#xff1a;Hash&#xff08;哈希&#xff09;&#xff0c;一般翻译做散列、杂凑&#xff0c;是把任意长度的输入&#xff08;数据信息&#xff09;通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值…

java学习3---面向对象

一、设计对象并使用 1.类和对象 类是共同特征的描述&#xff1b;对象是真实存在的具体实例。 2.类的几个补充注意事项 二、封装 对象代表什么&#xff0c;就得封装对应的数据&#xff0c;并提供数据对应的行为。 封装告诉我们如何正确的设计对象 三、this关键字 this可以区…

Maven

Maven 命令方式构建项目 mvn compile&#xff1a;编译项目&#xff0c;生成target文件&#xff08;不编译测试代码&#xff09; mvn package&#xff1a;打包项目&#xff0c;生成jar或war文件&#xff08;不指定默认jar包&#xff09; mvn clean&#xff1a;清理编译或打包后…

leetcode 173.二叉搜索树迭代器

1.题目要求: 2.题目代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nu…

vue插件清除 所有console.log()

一、作用 1、提升性能console.log() 语句会消耗一定的性能&#xff0c;尤其是在频繁调用的情况下。在生产环境中移除这些语句可以提高应用的运行效率。 2、减少信息泄露console.log() 可以输出敏感信息&#xff08;如用户数据、API 响应等&#xff09;。在生产环境中&#xf…

Day102漏洞发现-漏扫项目篇Poc开发Yaml语法插件一键生成匹配结果交互提取

知识点&#xff1a; 1、Nuclei-Poc开发-环境配置&编写流程 2、Nuclei-Poc开发-Yaml语法&匹配提取 3、Nuclei-Poc开发-BurpSuite一键生成插件 Nuclei-Poc开发-环境配置&编写流程 1、开发环境&#xff1a;VscodeYaml插件 Visual Studio Code - Code Editing. R…

【IEEE出版】第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议(ITCA 2024,12月06-08)

第六届国际科技创新学术交流大会暨信息技术与计算机应用学术会议&#xff08;ITCA 2024) 2024 6th International Conference on Information Technology and Computer Application 会议官网&#xff1a;itca2024.iaecst.org 会议时间&#xff1a;2024年12月06-08日 截稿时…

聊一聊Spring中的@Scheduled注解

一、样例 1.1 demo代码 package com.lazy.snail;import org.springframework.stereotype.Component; import org.springframework.scheduling.annotation.Scheduled;/*** ClassName MyTask* Description TODO* Author lazysnail* Date 2024/10/29 17:56* Version 1.0*/ Compo…

如何高效集成每刻与金蝶云星空的报销单数据

每刻报销单集成到金蝶云星空的技术实现 在企业日常运营中&#xff0c;费用报销和付款申请是两个至关重要的环节。为了提升数据处理效率和准确性&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将每刻系统中的报销单数据无缝对接到金蝶云星空的付款申请单中。本案例将详…

使用量化分析微信小程序工具“梦想兔企业智能风险分析助手”日常操作日记-3-预制菜-惠发食品(603536)

使用量化分析微信小程序工具“梦想兔企业智能风险分析助手”日常操作日记-预制菜。 直接看截图&#xff1a; 1.第一步&#xff1a; 查看产业链&#xff0c;选择查看“中国预制菜行业”&#xff0c;政策支持&#xff0c;热点 查看预制菜产业链 这里我选择了中游-生产商 到行业…

Elasticsearch:如何把 OpenAI 的代码修改为 Azure OpenAI

我们知道除了 OpenAI 提供数据嵌入及 Chat Completion 功能之外&#xff0c;Azure 也提供 OpenAI 类似的服务。这两个都是经常需要的平台。在我们的 Elasticsearh labs 里有很多代码是使用 OpenAI 来完成的&#xff0c;那么我们该如何把它们修改为使用 Azure 所提供的 OpenAI 呢…

软件体系结构

第一章 构件 具有某种功能的 可复用的软件结构单元,为组装服务,可部署,具有规范的接口规约和显式的语境依赖 构件模型 构件模型是对构件本质特征的抽象描述&#xff0c;可以把它想象成一个类的组合&#xff0c;它封装了多个类&#xff0c;并具有一个或多个服务而提供了简单…