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

ops/2025/1/18 17:27:35/

在后端使用 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.ppmy.cn/ops/151143.html

相关文章

Springboot + vue 图书管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

如何通过 Nginx 实现 CouchDB 集群的负载均衡并监控请求分发

在现代分布式系统中&#xff0c;负载均衡是确保高可用性和性能的关键组件。CouchDB 是一个强大的分布式数据库&#xff0c;而 Nginx 是一个高性能的反向代理和负载均衡器。本文将详细介绍如何通过 Nginx 实现 CouchDB 集群的负载均衡&#xff0c;并监控请求被分发到哪一台 Couc…

linux系统监视(centos 7)

一.系统监视 1.安装iostat&#xff0c;sar&#xff0c;sysstat&#xff08;默认没有&#xff0c;安装过可以跳跃&#xff09; iostat 和 sar&#xff1a; 同样&#xff0c;iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装&#xff1a;sudo yum install sysstat解释…

图解Git——分布式Git《Pro Git》

分布式工作流程 Centralized Workflow&#xff08;集中式工作流&#xff09; 所有开发者都与同一个中央仓库同步代码&#xff0c;每个人通过拉取、提交来合作。如果两个开发者同时修改了相同的文件&#xff0c;后一个开发者必须在推送之前合并其他人的更改。 Integration-Mana…

【Linux】gdb_进程概念

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

基于微信小程序的电子点菜系统设计与实现(KLW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

算法练习——链表

一&#xff1a;两数相加 题目要求&#xff1a; 解题思路&#xff1a; 思路&#xff1a;注意进位即可 实现代码&#xff1a; ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* cur1 l1, * cur2 l2;ListNode* phead new ListNode(0);ListNode* cur phead;in…

【概率论与数理统计】第三章 多维随机变量及其分布(2)

定义7&#xff1a;若二维连续型随机变量 ( X , Y ) (X,Y) (X,Y)的概率密度为&#xff1a; f ( x , y ) 1 2 π σ 1 σ 2 1 − ρ 2 e − 1 2 ( 1 − ρ 2 ) [ ( x − μ 1 ) 2 σ 1 2 − 2 ρ ( x − μ 1 ) ( y − μ 2 ) σ 1 σ 2 ( y − μ 2 ) 2 σ 2 2 ] f(x,y) \fra…