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

spring boot 集成 redis 实现缓存的完整的例子

@Cacheable 注解是 Spring Cache 抽象的一部分,用于声明式地管理缓存。@Cacheable 注解本身并不直接指定缓存的存储位置,而是依赖于配置的缓存管理器(CacheManager)来决定缓存数据的存储位置。

常见的缓存存储方式:

1、内存缓存:

Simple Cache Manager:默认情况下,Spring 使用 ConcurrentMapCacheManager,它将缓存数据存储在内存中的 ConcurrentHashMap 中。
Caffeine:Caffeine 是一个高性能的内存缓存库,常用于本地缓存。Spring Cache 可以集成 Caffeine 作为缓存管理器。

2、分布式缓存:

Redis:Redis 是一个高性能的键值存储系统,支持网络、持久化、多语言 API 等特性。Spring Cache 可以通过 RedisCacheManager 集成 Redis。
Ehcache:Ehcache 是一个广受欢迎的分布式缓存解决方案,支持本地缓存和分布式缓存。Spring Cache 可以通过 EhCacheCacheManager 集成 Ehcache。
Hazelcast:Hazelcast 是一个开源的内存数据网格,支持分布式缓存。Spring Cache 可以通过 HazelcastCacheManager 集成 Hazelcast。

下面举例在 Spring Boot 应用程序中结合 Redis 实现缓存。我们将使用 @Cacheable 注解来缓存方法的结果,并使用 RedisCacheManager 作为缓存管理器。

1. 添加依赖 首先,在 pom.xml 中添加必要的依赖:

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Data Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- Spring Boot Starter Cache --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!-- Lombok (可选) --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>
</dependencies>

2. 配置 Redis

在 application.properties 文件中配置 Redis 连接信息:

spring.redis.host=localhost
spring.redis.port=6379

3. 配置缓存管理器

创建一个配置类来配置 RedisCacheManager:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;import java.time.Duration;@Configuration
public class CacheConfig {@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(1)) // 设置缓存过期时间为1小时.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).build();}
}

ps: 补充一下,使用ConcurrentMapCacheManager 默认的缓存方式:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;@Configuration
public class CacheConfig {//spring 默认的缓存配置@Beanpublic CacheManager cacheManager() {return new ConcurrentMapCacheManager("personal_Cache");}
}

4. 创建缓存接口和实现

创建一个简单的接口和实现类,用于演示缓存功能:

// 缓存接口
public interface CacheService {String getAttribute(String key);
}// 缓存实现类
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class CacheServiceImpl implements CacheService {@Override@Cacheable(value = "attributes", key = "#key")public String getAttribute(String key) {// 模拟耗时的数据库查询或其他操作try {Thread.sleep(2000); // 模拟延迟} catch (InterruptedException e) {e.printStackTrace();}return "Attribute value for " + key;}//清除缓存 @Override@CacheEvict(value = "attributes", key = "#key")public void evictAttribute(String key) {.....}
}

5. 创建控制器

创建一个控制器来测试缓存功能:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class CacheController {@Autowiredprivate CacheService cacheService;//模拟使用缓存@GetMapping("/getAttribute")public String getAttribute(@RequestParam String key) {return cacheService.getAttribute(key);}//模拟清除缓存@GetMapping("/evictAttribute")public String evictAttribute(@RequestParam String key) {return cacheService.evictAttribute(key);}
}

6. 启动类

创建一个启动类来启动 Spring Boot 应用程序:

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

总结

通过上述步骤,我们成功地在 Spring Boot 应用程序中集成了 Redis 作为缓存存储,并使用 @Cacheable 注解实现了方法级别的缓存。这样可以显著提高应用程序的性能,特别是在处理频繁且耗时的数据查询时。

http://www.lryc.cn/news/486804.html

相关文章:

  • json-bigint处理前端精度丢失问题
  • 【算法】【优选算法】前缀和(下)
  • Node.js 23 发布了!
  • 如何通过低代码逻辑编排实现业务流程自动化?
  • thinkphp6模板调用URL方法生成的链接异常
  • Spring Boot汽车资讯:科技驱动的未来
  • 嵌入式硬件电子电路设计(五)LDO低压差线性稳压器全面详解
  • qiankun主应用(vue2+element-ui)子应用(vue3+element-plus)不同版本element框架css样式相互影响的问题
  • resnet50,clip,Faiss+Flask简易图文搜索服务
  • 使用OkHttp进行HTTPS请求的Kotlin实现
  • 使用Mac下载MySQL修改密码
  • 运维面试题.云计算面试题集锦第一套
  • CSS-flex布局
  • Linux:进程的优先级 进程切换
  • web应用安全和信息泄露
  • 创建vue3项目步骤
  • 尽量通俗易懂地概述.Net U nity跨语言/跨平台相关知识
  • 【AlphaFold3】开源本地的安装及使用
  • vue2/vue3中使用的富文本编辑器vue-quill
  • 论文阅读《BEVFormer v2》
  • 自动化运维(k8s):一键获取指定命名空间镜像包脚本
  • HarmonyOS ArkUI(基于ArkTS) 开发布局 (上)
  • 第九部分 :1.STM32之通信接口《精讲》(USART,I2C,SPI,CAN,USB)
  • 5. langgraph中的react agent使用 (从零构建一个react agent)
  • uniapp vue3的下拉刷新和上拉加载
  • STM32设计井下瓦斯检测联网WIFI加Zigbee多路节点协调器传输
  • Vue 3 中的原生事件监听与组件事件处理详解
  • Flink Source 详解
  • 2024年了,TCP分析工具有哪些?
  • SRP 实现 Cook-Torrance BRDF