如何在后端使用redis进行缓存,任意一种语言都可以

在后端使用 Redis 可以显著提升应用的性能,特别是在处理高并发请求、缓存数据、会话管理、消息队列等场景。以下是关于如何在 Spring Boot 项目中集成和使用 Redis 的详细讲解。

1. 添加依赖

首先,在 pom.xml 文件中添加 Redis 相关的依赖。Spring Boot 提供了对 Redis 的支持,我们可以通过 spring-boot-starter-data-redis 来快速集成。

 

xml

深色版本

<dependencies><!-- 其他依赖 --><!-- Redis 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 如果你需要使用 Redis 的 JSON 支持,可以添加以下依赖 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>
</dependencies>

2. 配置 Redis 连接

application.ymlapplication.properties 文件中配置 Redis 的连接信息。你可以根据实际情况调整这些配置项。

application.yml 示例:

spring:redis:host: localhost  # Redis 服务器地址port: 6379       # Redis 服务器端口password:        # Redis 密码(如果需要)lettuce:pool:max-active: 8    # 最大连接数max-wait: -1     # 连接池最大阻塞等待时间(-1 表示无限等待)max-idle: 8      # 连接池中的最大空闲连接min-idle: 0      # 连接池中的最小空闲连接

application.properties 示例:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

3. 使用 RedisTemplate 进行基本操作

RedisTemplate 是 Spring Data Redis 提供的一个模板类,用于执行 Redis 命令。你可以通过它进行键值对的存储、查询、删除等操作。

3.1 自定义 RedisTemplate

为了方便使用,你可以创建一个自定义的 RedisTemplate,并将其注入到服务中。

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 redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);// 设置键的序列化方式为 Stringtemplate.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(new StringRedisSerializer());// 设置值的序列化方式为 JSONtemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());return template;}
}

3.2 在服务中使用 RedisTemplate

你可以在服务类中注入 RedisTemplate,并使用它来进行 Redis 操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class CacheService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 存储数据到 Redispublic void setCacheData(String key, Object value, long expireTime) {redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);}// 从 Redis 获取数据public Object getCacheData(String key) {return redisTemplate.opsForValue().get(key);}// 删除 Redis 中的数据public void deleteCacheData(String key) {redisTemplate.delete(key);}// 检查 Redis 中是否存在某个键public boolean hasKey(String key) {return redisTemplate.hasKey(key);}
}

4. 使用 Redis 缓存注解

Spring 提供了 @Cacheable@CachePut@CacheEvict 等注解,可以帮助你更方便地管理缓存。你可以结合 Redis 使用这些注解来实现自动化的缓存管理。

4.1 启用缓存功能

在主类或配置类上添加 @EnableCaching 注解,以启用缓存功能。

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);}
}

4.2 使用 @Cacheable 注解

@Cacheable 注解用于缓存方法的结果。当调用该方法时,Spring 会先检查缓存中是否已经有结果,如果有则直接返回缓存中的数据,而不会再次执行方法。

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class ProductService {@Cacheable(value = "products", key = "#id")public Product getProductById(Long id) {// 模拟从数据库获取产品数据System.out.println("Fetching product from database...");return new Product(id, "Product " + id);}
}

4.3 使用 @CachePut 注解

@CachePut 注解用于更新缓存中的数据。即使缓存中已经存在数据,方法仍然会被执行,并将最新的结果存入缓存。

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;@Service
public class ProductService {@CachePut(value = "products", key = "#product.id")public Product updateProduct(Product product) {// 模拟更新产品数据System.out.println("Updating product in database...");return product;}
}

4.4 使用 @CacheEvict 注解

@CacheEvict 注解用于清除缓存中的数据。你可以指定清除单个键或所有键。

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;@Service
public class ProductService {@CacheEvict(value = "products", key = "#id")public void deleteProduct(Long id) {// 模拟删除产品数据System.out.println("Deleting product from database...");}@CacheEvict(value = "products", allEntries = true)public void clearAllProducts() {// 清除所有产品缓存System.out.println("Clearing all products from cache...");}
}

5. 使用 Redis 作为会话存储

Spring Session 提供了对 Redis 的支持,可以将用户的会话数据存储在 Redis 中,从而实现分布式会话管理。

5.1 添加依赖

pom.xml 中添加 spring-session-data-redis 依赖。

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

5.2 配置 Spring Session

application.yml 中配置 Spring Session 使用 Redis 作为会话存储。

spring:session:store-type: redisredis:namespace: spring:session

5.3 启用 Spring Session

在主类或配置类上添加 @EnableRedisHttpSession 注解,以启用 Redis 会话存储。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;@SpringBootApplication
@EnableRedisHttpSession
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

6. 使用 Redis 作为消息队列

Redis 还可以用作消息队列,特别是通过其发布/订阅(Pub/Sub)机制。你可以使用 RedisTemplateconvertAndSend 方法发送消息,并使用 @RedisListener 注解监听消息。

6.1 发送消息

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;@Service
public class MessagePublisher {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void publishMessage(String channel, String message) {redisTemplate.convertAndSend(channel, message);}
}

6.2 监听消息

import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.stereotype.Service;@Service
public class MessageSubscriber {@Autowiredprivate RedisMessageListenerContainer redisContainer;public void subscribeToChannel(String channel) {ChannelTopic topic = new ChannelTopic(channel);redisContainer.addMessageListener((message, pattern) -> {System.out.println("Received message: " + message.toString());}, topic);}
}

7. 使用 Redis 作为限流工具

Redis 还可以用于实现限流功能,例如限制每个 IP 地址的访问次数。你可以使用 Redis 的计数器功能来实现这一点。

7.1 实现限流逻辑

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
public class RateLimiter {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public boolean isAllowed(String key, int maxRequests, int timeWindowInSeconds) {Long requestCount = redisTemplate.opsForValue().increment(key);if (requestCount == 1) {// 如果是第一次请求,设置过期时间redisTemplate.expire(key, timeWindowInSeconds, TimeUnit.SECONDS);}return requestCount <= maxRequests;}
}

总结

通过以上步骤,你可以在 Spring Boot 项目中集成和使用 Redis,实现缓存、会话管理、消息队列、限流等功能。Redis 的高效性和灵活性使其成为现代应用中不可或缺的一部分。根据你的具体需求,可以选择合适的方式使用 Redis 来优化应用性能和用户体验。

 

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

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

相关文章

MPLS原理及配置

赶时间可以只看实验部分 由来&#xff1a;90年代中期&#xff0c;互联网流量的快速增长。传统IP报文依赖路由器查询路由表转发&#xff0c;但由于硬件技术存在限制导致转发性能低&#xff0c;查表转发成为了网络数据转发的瓶颈。 因此&#xff0c;旨在提高路由器转发速度的MPL…

《机器学习》——TF-IDF(关键词提取)

文章目录 TF-IDF简介TF-IDF应用场景TF-IDF模型模型参数主要参数 TF-IDF实例实例步骤导入数据和模块处理数据处理文章开头和分卷处理将各卷内容存储到数据帧jieba分词和去停用词处理 计算 TF-IDF 并找出核心关键词 TF-IDF简介 TF - IDF&#xff08;Term Frequency - Inverse Do…

【计算机网络】窥探计网全貌:说说计算机网络体系结构?

标签难度考察频率综合题⭐⭐⭐60% 这个问题在计算机网络知识体系中是一个比较重要的问题&#xff0c;只有完整地了解计算机网络的体系结构才能清晰地认识网络的运行原理。 在回答这个问题时&#xff0c;笔者认为有几个比较重要的点&#xff1a; 首先一定要分清楚前置条件&am…

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 &#xff08;1&#xff09;元素选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器&#xff1a;必…

【解决】okhttp的java.lang.IllegalStateException: closed错误

问题 Android 使用OKHttp进行后端通信&#xff0c;后端处理结果&#xff0c;反馈给前端的responseBody中其实有值&#xff0c;但是一直报异常&#xff0c;后来才发现主要是OkHttp请求回调中response.body().string()只能有效调用一次&#xff0c;而我使用了两次&#xff1a; 解…

从硬件设备看Linux

一、介绍 DM3730通过各种连接方式连接了各种设备&#xff0c;输入输出设备根据不同的类型大体可 以分为电源管理、用户输人、显示输出、图像采集、存储以及无线设备等。我们可以将DM 3730与这些设备的数据接口分为总线和单一的数据接口总线。总线的显著特点是单个总线上可以连…

【优选算法】DC-Quicksort-Mysteries:分治-快排的算法之迷

文章目录 1.概念解析2.颜色分类3.排序数组4.数组中的第k个最大元素5.库存管理Ⅲ希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 本篇是优选算法之分治-快排&#xff0c;快排可以在更短的时间内完成相同规模数据的排序任务&#xff0c;大大提升了…

浅谈云计算09 | 服务器虚拟化

服务器虚拟化基础 一、虚拟化的定义二、系统虚拟化三、服务器虚拟化的核心要义四、典型实现&#xff1a;探索不同路径五、全虚拟化与半虚拟化六、主流服务器虚拟化技术 一、虚拟化的定义 虚拟化是一种将物理资源抽象为逻辑资源的技术&#xff0c;通过在物理硬件与操作系统、应…

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

CSS 盒模型

盒模型 CSS盒模型是网页布局的核心概念之一&#xff0c;它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范&#xff0c;每个HTML元素都被视为一个矩形盒子&#xff0c;这个盒子由以下四个部分组成&#xff1a; 内容区&#xff08;Content area&#xff…

JVM:ZGC详解(染色指针,内存管理,算法流程,分代ZGC)

1&#xff0c;ZGC&#xff08;JDK21之前&#xff09; ZGC 的核心是一个并发垃圾收集器&#xff0c;所有繁重的工作都在Java 线程继续执行的同时完成。这极大地降低了垃圾收集对应用程序响应时间的影响。 ZGC为了支持太字节&#xff08;TB&#xff09;级内存&#xff0c;设计了基…

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …

【数学】概率论与数理统计(五)

文章目录 [toc] 二维随机向量及其分布随机向量离散型随机向量的概率分布律性质示例问题解答 连续型随机向量的概率密度函数随机向量的分布函数性质连续型随机向量均匀分布 边缘分布边缘概率分布律边缘概率密度函数二维正态分布示例问题解答 边缘分布函数 二维随机向量及其分布 …

四 BH1750 光感驱动调试2

之前调通了用户态接口,android 使用还是不方便,要包装jni使用。 这里集成了内核 iio 驱动 ,提供 sys-fs 文件接口 可供固件以及 ANDROID 应用层使用 一 驱动集成 : 1.1 dts 修改 修改文件 : kernel/arch/arm64/boot/dts/rockchip/rp-rk3568.dts 在 i2c5 增加设备,如…

Redis持久化双雄

Redis持久化 Redis 的持久化是指将内存中的数据保存到硬盘&#xff0c;以防止服务器宕机导致数据丢失的机制。 redis 提供了两种持久化的方式&#xff0c;分别是RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。 RDB&#xff0c;简…

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…

数字证书管理服务

阿里云数字证书管理服务&#xff08;Aliyun Certificate Management Service, ACM&#xff09;是一种云端服务&#xff0c;专门用于帮助企业管理和颁发数字证书。数字证书是网络安全中的重要组成部分&#xff0c;它可以确保通信的安全性、身份认证以及数据的完整性。通过阿里云…

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot&#xff08;1&#xff09;基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot&#xff08;2&#xff09;解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot&#xff08;3&#xff09;教你手工搭建Spring Boot项目纯手工玩法…

Zookeeper概览

个人博客地址&#xff1a;Zookeeper概览 | 一张假钞的真实世界 设计目标 简单的&#xff1a;方便使用以实现复杂的业务应用。复制式的&#xff1a;跟Zookeeper协调的分布式进程一样&#xff0c;它也是在一组服务器上复制的。集群的每个节点间互相知道。它们维护一个状态数据在…