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

devtools/2025/1/16 4:25:44/

在后端使用 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/devtools/150328.html

相关文章

css盒子水平垂直居中

目录 1采用flex弹性布局&#xff1a; 2子绝父相margin&#xff1a;负值&#xff1a; 3.子绝父相margin:auto&#xff1a; 4子绝父相transform&#xff1a; 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接&#xff1a;文字水平垂直居中-CSDN博客 以下为盒子…

浅谈云计算08 | 基本云架构

浅谈基本云架构 一、负载分布架构二、资源池架构三、动态可扩展架构四、弹性资源容量架构五、服务负载均衡架构六、云爆发架构七、弹性磁盘供给架构八、冗余存储架构 在当今数字化时代&#xff0c;云计算已成为企业发展的核心驱动力&#xff0c;而其背后的一系列关键架构则是支…

Golang笔记——数组、Slice、Map、Channel的并发安全性

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Golang常用数据类型的并发安全性&#xff0c;特别是复合数据类型&#xff08;数组、Slice、Map、Channel&#xff09;的并发安全性。 文章目录 线…

Linux(18)——提高命令行运行效率

目录 一、创建和执行 shell 脚本&#xff1a; 1、命令解释器&#xff1a; 2、执行 Bash Shell 脚本&#xff1a; 3、从 shell 脚本提供输出&#xff1a; 二、对特殊字符加引号&#xff1a; 1、反斜杠 &#xff08;\&#xff09;&#xff1a; 2、单引号 &#xff08; &…

从 MySQL 到 ClickHouse 的迁移与优化——支持上亿级数据量的复杂检索

文章目录 1. ClickHouse 背景与使用场景1.1 ClickHouse 简介1.2 ClickHouse 的特点1.3 ClickHouse 的使用场景 2. 从 MySQL 到 ClickHouse 的迁移2.1 MySQL 与 ClickHouse 的对比2.2 迁移背景2.3 迁移注意事项2.3.1 数据模型设计2.3.2 数据迁移2.3.3 SpringBoot 项目改造2.3.4 …

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…

设计模式——单例模式

单例模式 实现单例模式的方法前置条件懒汉式&#xff08;Lazy Initialization&#xff09;饿汉式&#xff08;Eager Initialization&#xff09;双重锁式&#xff08;Double-Checked Locking&#xff09;静态内部类式&#xff08;Static Inner Class&#xff09;枚举式&#xf…

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…