当前位置: 首页 > article >正文

Redis的操作以及Spring Cache框架

Redis是一种开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。在Spring应用中,可以使用Spring Cache框架结合Redis来实现高效的缓存机制。本文将详细介绍Redis的基本操作以及如何在Spring Boot中使用Spring Cache框架集成Redis。

一、Redis的基本操作

1.1 字符串操作

设置键值对
SET key value
​

示例:

SET myKey "Hello, Redis!"
​
获取值
GET key
​

示例:

GET myKey
​

1.2 哈希操作

设置哈希值
HSET key field value
​

示例:

HSET myHash field1 "value1"
​
获取哈希值
HGET key field
​

示例:

HGET myHash field1
​

1.3 列表操作

向列表左侧推入值
LPUSH key value
​

示例:

LPUSH myList "value1"
​
从列表右侧弹出值
RPOP key
​

示例:

RPOP myList
​

1.4 集合操作

向集合添加值
SADD key member
​

示例:

SADD mySet "member1"
​
获取集合中的所有值
SMEMBERS key
​

示例:

SMEMBERS mySet
​

1.5 有序集合操作

向有序集合添加值
ZADD key score member
​

示例:

ZADD myZSet 1 "member1"
​
获取有序集合中的值
ZRANGE key start stop
​

示例:

ZRANGE myZSet 0 -1
​

二、Spring Cache框架集成Redis

2.1 引入依赖

在 pom.xml中添加Spring Boot和Redis的依赖:

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

2.2 配置Redis连接

在 application.yml或 application.properties中配置Redis连接信息:

spring:redis:host: localhostport: 6379password: yourpassword # 如果没有设置密码,可以省略lettuce:pool:max-active: 8max-wait: -1max-idle: 8min-idle: 0
​

2.3 启用缓存支持

在Spring Boot的主应用类上启用缓存支持:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
​

2.4 配置缓存管理器

创建一个配置类,用于配置Redis缓存管理器:

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.redis.RedisCacheConfiguration;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.cache.redis.RedisCacheWriter;
import org.springframework.cache.redis.connection.RedisConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.time.Duration;@EnableCaching
@Configuration
public class CacheConfig extends CachingConfigurerSupport {@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(60)); // 设置缓存过期时间return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)).cacheDefaults(redisCacheConfiguration).build();}
}
​

2.5 使用缓存注解

在需要缓存的方法上使用缓存注解,Spring提供了 @Cacheable@CachePut和 @CacheEvict等注解,方便地进行缓存操作。

2.5.1 @Cacheable

@Cacheable注解用于将方法的返回结果缓存起来,缓存的键由方法参数组成。

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class UserService {@Cacheable(value = "users", key = "#userId")public User getUserById(String userId) {// 模拟从数据库中获取用户信息return new User(userId, "John Doe", "john@example.com");}
}
​
2.5.2 @CachePut

@CachePut注解用于更新缓存,不影响方法的执行。

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;@Service
public class UserService {@CachePut(value = "users", key = "#user.id")public User updateUser(User user) {// 模拟更新数据库中的用户信息return user;}
}
​
2.5.3 @CacheEvict

@CacheEvict注解用于清除缓存,通常在删除或更新操作时使用。

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;@Service
public class UserService {@CacheEvict(value = "users", key = "#userId")public void deleteUserById(String userId) {// 模拟从数据库中删除用户信息}
}
​

三、示例项目

以下是一个完整的示例项目,展示了如何在Spring Boot中使用Redis进行缓存操作。

3.1 项目结构

├── src
│   ├── main
│   │   ├── java
│   │   │   ├── com
│   │   │   │   ├── example
│   │   │   │   │   ├── Application.java
│   │   │   │   │   ├── CacheConfig.java
│   │   │   │   │   ├── UserService.java
│   │   ├── resources
│   │   │   ├── application.yml
​

3.2 代码实现

Application.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication
@EnableCaching
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
​
CacheConfig.java
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.redis.RedisCacheConfiguration;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.cache.redis.RedisCacheWriter;
import org.springframework.cache.redis.connection.RedisConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.time.Duration;@Configuration
public class CacheConfig extends CachingConfigurerSupport {@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(60)); // 设置缓存过期时间return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)).cacheDefaults(redisCacheConfiguration).build();}
}
​
UserService.java
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;@Service
public class UserService {@Cacheable(value = "users", key = "#userId")public User getUserById(String userId) {// 模拟从数据库中获取用户信息return new User(userId, "John Doe", "john@example.com");}@CachePut(value = "users", key = "#user.id")public User updateUser(User user) {// 模拟更新数据库中的用户信息return user;}@CacheEvict(value = "users", key = "#userId")public void deleteUserById(String userId) {// 模拟从数据库中删除用户信息}
}
​
application.yml
spring:redis:host: localhostport: 6379password: yourpassword # 如果没有设置密码,可以省略lettuce:pool:max-active: 8max-wait: -1max-idle: 8min-idle: 0
​

四、总结

通过本文的介绍,我们详细讲解了Redis的基本操作

以及如何在Spring Boot应用中使用Spring Cache框架集成Redis。Redis提供了丰富的数据结构和高效的内存存储能力,结合Spring Cache框架,可以显著提高应用的性能和响应速度。

相关文章:

Redis的操作以及Spring Cache框架

Redis是一种开源的内存数据结构存储&#xff0c;用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。在Spring应用中&#xff0c;可以使用Spring Cache框架结合Redis来实现高效的缓存机制。本文将详细介绍Redis的基本操作以及…...

C#输出参数:使用、要求与新特性

在C#编程中&#xff0c;输出参数是一种强大的工具&#xff0c;用于从方法体内把数据传出到调用代码。它的行为与引用参数类似&#xff0c;但也有自己的特点。今天我们就来详细了解一下C#中的输出参数。 输出参数的基本要求 修饰符的使用 输出参数必须在声明和调用中都使用修…...

信号处理基础

一、目的 掌握信号处理的基本思想&#xff0c;理解采样信号的频谱特性,加强信号采样与重建的有关基本概念的理解&#xff0c;深入理解线性时不变系统输出与输入的关系&#xff0c;了解数字信号采样率转换前后信号频谱的特征。 二、内容与设计思想 1、给定序列&#xff0c;绘…...

小刚说C语言刷题—1058 - 求出100至999范围内的所有水仙花数

1.题目描述 2.参考代码(C语言版) #include <stdio.h> int main(void) { int i; int bai,shi,ge; for( i100;i<999;i) { baii/100; shii/10%10; gei%10; if((bai*bai*bai)(shi*shi*shi)(ge*ge*ge)i) printf("%d\n",i); } return 0; } 今天内容到此结束&…...

cat、more和less的区别

在 Linux 系统中&#xff0c;cat、more 和 less 都是用于查看文件内容的命令&#xff0c;但它们在功能和使用场景上有显著区别。以下是它们的详细对比&#xff1a; 1. cat 命令 功能&#xff1a; - 直接输出整个文件&#xff1a;一次性将文件内容全部显示在终端上&#xff…...

深入解析Docker:核心架构与最佳实践

文章目录 前言一、Docker 解决了什么问题&#xff1f;二、Docker 底层核心架构2.1 Docker 引擎的分层架构2.2 镜像的奥秘&#xff1a;联合文件系统&#xff08;UnionFS&#xff09;2.3 容器隔离的核心技术2.3.1 命名空间2.3.2 控制组&#xff08;Cgroups&#xff09;2.3.3 内核…...

HVV面试题汇总合集

应急响应的命令 Linux ps -aux 查看进程 netstat -antlp 查看端口 top查看 cpu使用情况 Windows tasklist 查看进程 netstat -an 查看端口struts2原理特征 原理: 045:默认的content-type解析器会把用户传来的数据直接当成代码执行&#xff0c;造成rce 特征:ognl表达式&…...

什么是深度神经网络

深度神经网络(DNN)详细介绍 1. 定义与核心原理 深度神经网络(Deep Neural Network, DNN)是一种具有多个隐藏层的人工神经网络模型,其核心在于通过层次化的非线性变换逐步提取输入数据的高层次抽象特征。与浅层神经网络相比,DNN的隐藏层数量通常超过三层,例如VGGNet、R…...

Node.js 24.0 正式发布:性能跃升与开发体验全面升级

Node.js v24.0.0 震撼发布&#xff01;V8 13.6、npm 11、权限模型稳定化等重磅更新 2025年5月6日 —— Node.js 社区迎来重大里程碑&#xff01;Node.js v24.0.0 正式发布&#xff0c;带来一系列激动人心的新特性、性能优化和 API 改进。本次更新涵盖 V8 JavaScript 引擎升级至…...

Linux/AndroidOS中进程间的通信线程间的同步 - 信号量

1 概述 本文将介绍 POSIX 信号量&#xff0c;它允许进程和线程同步对共享资源的访问。有两种类型的 POSIX 信号量&#xff1a; 命名信号量&#xff1a;这种信号量拥有一个名字。通过使用相同的名字调用 sem_open()&#xff0c;不相关的进程能够访问同一个信号量。未命名信号量…...

Python Cookbook-7.10 在 MySQL 数据库中储存 BLOB

任务 想把一个二进制的大对象(BLOB)存入MySQL数据库 解决方案 MySQLdb 模块并不支持完整的占位符,不过可以使用模块的escape_string 函数来解决: import MySQLdb,cPickle #连接到数据库,用你的本机来测试数据库,并获得游标 connection = MySQLdb.connect(db = "tes…...

Edge浏览器PDF字体显示错误

Edge浏览器PDF字体显示错误 软件版本信息 Edge Version: 136.0.3240.50 Word Version: Microsoft Office 专业增强版2021问题描述 在Word中使用多级列表自动编号, 并使用Word软件自带的导出为PDF文件功能, 在Word中显示正常的数字, 在Edge中查看PDF将会出现渲染错误的现象,…...

计算机网络与多线程同步机制详解

一、IP地址与子网划分 在互联网世界中&#xff0c;IP地址就像是每个设备的"门牌号"&#xff0c;它使得数据包能够准确送达目的地。IP地址的划分与管理就像城市的规划&#xff0c;通过合理的子网划分&#xff0c;能够高效地管理网络资源。 子网掩码的工作原理 子网…...

Python训练营打卡——DAY22(2025.5.11)

复习日 学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号——来自灾难的机器学习 数据来源&#xff1a; kaggle泰坦里克号人员生还预测 挑战 泰坦尼克号沉没是历史上最臭名昭著的海难之一。 1912年4月15日&#xff0c;在被普…...

实战项目4(05)

​目录 任务场景一 【sw1配置】 任务场景二 【sw1配置】 【sw2配置】 任务场景一 按照下图完成网络拓扑搭建和配置 任务要求&#xff1a; 1、在交换机SW1的E0/0/1端口进行设置&#xff0c;实现允许最多两个电脑可以正常进行通信。 2、在交换机SW1的E0/0/2端口进行设置&…...

快速上手Pytorch Lighting框架 | 深度学习入门

快速上手Pytorch Lighting框架 | 深度学习入门 前言参考官方文档 介绍快速上手基本流程常用接口LightningModule\_\_init\_\_ & setup()\*\_step()configure_callbacks()configure_optimizers()load_from_checkpoint Trainer常用参数 可选接口LoggersTensorBoard Logger Ca…...

C++学习之STL学习

在经过前面的简单的C入门语法的学习后&#xff0c;我们开始接触C最重要的组成部分之一&#xff1a;STL 目录 STL的介绍 什么是STL STL的历史 UTF-8编码原理&#xff08;了解&#xff09; UTF-8编码原理 核心编码规则 规则解析 编码步骤示例 1. 确定码点范围 2. 转换为…...

3. 仓颉 CEF 库封装

文章目录 1. capi 使用说明2. Cangjie CEF2. 1实现目标 3. 实现示例 1. capi 使用说明 根据上一节 https://blog.csdn.net/qq_51355375/article/details/147880718?spm1011.2415.3001.5331 所述&#xff0c; cefcapi 是libcef 共享库导出一个 C API, 而以源代码形式分发的 li…...

LabVIEW多通道并行数据存储系统

在工业自动化监测、航空航天测试、生物医学信号采集等领域&#xff0c;常常需要对多个传感器通道的数据进行同步采集&#xff0c;并根据后续分析需求以不同采样率保存特定通道组合。传统单线程数据存储方案难以满足实时性和资源利用效率的要求&#xff0c;因此设计一个高效的多…...

谷歌在即将举行的I/O大会之前,意外泄露了其全新设计语言“Material 3 Expressive”的细节

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

十三、基于大模型的在线搜索平台——整合function calling流程

基于大模型的在线搜索平台——整合function calling流程 一、function calling调用总结 上篇文章已经实现了信息抓取能力&#xff0c;并封装成了函数。现在最后一步将能力转换为大模型可以调用的能力&#xff0c;实现搜索功能就可以了。这篇主要实现大模型的function calling能…...

力扣70题解

记录 2025.5.8 题目: 思路&#xff1a; 1.初始化&#xff1a;p 和 q 初始化为 0&#xff0c;表示到达第 0 级和第 1 级前的方法数。r 初始化为 1&#xff0c;表示到达第 1 级台阶有 1 种方法。 2.循环迭代&#xff1a;从第 1 级到第 n 级台阶进行迭代&#xff1a; p 更新为前…...

电商双11美妆数据分析

1、初步了解 2.2 缺失值处理 通过上面观察数据发现sale_count,comment_count 存在缺失值,先观察存在缺失值的行的基本情况 2.3 数据挖掘寻找新的特征 给出各个关键词的分类类别 由title新生成两列类别 对是否是男性专用进行分析并新增一列 对每个产品总销量新增销售额这一列...

Python爬虫实战:研究nodejs aes加密

1. 引言 1.1 研究背景与意义 在当今数字化时代,Web 数据的价值日益凸显。通过爬虫技术获取公开数据并进行分析,能够为企业决策、学术研究等提供有力支持。然而,为了保护数据安全和隐私,许多网站采用了加密技术对数据进行保护,其中 AES 加密是一种常见且安全的加密算法。…...

24、TypeScript:预言家之书——React 19 类型系统

一、预言家的本质 "TypeScript是魔法世界的预言家之书&#xff0c;用静态类型编织代码的命运轨迹&#xff01;" 霍格沃茨符文研究院的巫师挥动魔杖&#xff0c;类型注解与泛型的星轨在空中交织成防护矩阵。 ——基于《国际魔法联合会》第12号类型协议&#xff0c;Ty…...

第8章-1 查询性能优化-优化数据访问

上一篇&#xff1a;《第7章-3 维护索引和表》 在前面的章节中&#xff0c;我们介绍了如何设计最优的库表结构、如何建立最好的索引&#xff0c;这些对于提高性能来说是必不可少的。但这些还不够——还需要合理地设计查询。如果查询写得很糟糕&#xff0c;即使库表结构再合理、索…...

PCL点云按指定方向进行聚类(指定类的宽度)

需指定方向和类的宽度。测试代码如下&#xff1a; #include <iostream> #include <fstream> #include <vector> #include <string> #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/visualization/pcl_visu…...

复现nn-Unet模型 实验报告

目的是将 nn-Unet 模型应用到切割脑出血CT图像上 论文学习步骤为 1.学习Unet&#xff0c;Unet等模型作为复现nn-Unet模型的基础。 2.学习nn-Unet原论文&#xff0c;掌握nn-Unet的结构。 3.学习将nn-Unet模型应用到切割脑出血CT医学图像的相关论文。 这周学习了Unet&#x…...

C#对SQLServer增删改查

1.创建数据库 2.SqlServerHelper using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks;namespace WindowsFormsApp1 {internal class SqlServerHelper{//…...

模拟太阳系(C#编写的maui跨平台项目源码)

源码下载地址&#xff1a;https://download.csdn.net/download/wgxds/90789056 本资源为用C#编写的maui跨平台项目源码&#xff0c;使用Visual Studio 2022开发环境&#xff0c;基于.net8.0框架&#xff0c;生成的程序为“模拟太阳系运行”。经测试&#xff0c;生成的程序可运行…...