【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的缓存技术:使用 Redis 提升性能

<前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

今儿个咱唠唠 Spring Boot 里头的缓存技术。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己"翻车"了。

二、缓存是啥玩意儿?

缓存是提升系统性能的一个利器,说白了就是把一些常用的数据存到内存里头,下次再用的时候直接从内存拿,不用再去数据库查了。Spring Boot 里头默认就集成了缓存技术,用起来贼方便。

1. 缓存的分类

缓存分两种:本地缓存分布式缓存

  • 本地缓存:就是把数据存到应用的内存里头,速度快,但是容量有限,而且不能跨应用共享。
  • 分布式缓存:就是把数据存到外部的缓存服务器里头,容量大,而且可以跨应用共享,但是速度比本地缓存慢。

2. Redis 是啥玩意儿?

Redis 是一个开源的、高性能的分布式缓存数据库,支持多种数据结构,比如说字符串、哈希、列表、集合啥的。Spring Boot 里头默认就集成了 Redis,用起来贼方便。

三、Spring Boot 集成 Redis

Spring Boot 里头集成 Redis 很简单,只要加个依赖,配个连接信息就行了。

1. 添加依赖

首先,你得在 pom.xml 里头加个 Redis 的依赖。

|--------------------------------------------------------------------------------------------------------------------------------------------|
| XML Code |
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> |

这段代码里头,spring-boot-starter-data-redis 是 Spring Boot 里头的 Redis 依赖。

2. 配置连接信息

然后,你得在 application.properties 里头配个 Redis 的连接信息。

|----------------------------------------------------|
| Properties Code |
| spring.redis.host=localhost spring.redis.port=6379 |

这段代码里头,spring.redis.host 是 Redis 的主机地址,spring.redis.port 是 Redis 的端口号。

3. 使用 RedisTemplate

最后,你可以在代码里头用 RedisTemplate 来操作 Redis。

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Service public class MyService { @Autowired private RedisTemplate<String, String> redisTemplate; public void setValue(String key, String value) { redisTemplate.opsForValue().set(key, value); } public String getValue(String key) { return redisTemplate.opsForValue().get(key); } } |

这段代码里头,RedisTemplate 是 Spring Boot 里头的一个类,用来操作 Redis 的。

四、Spring Boot 使用 Redis 缓存

Spring Boot 里头使用 Redis 缓存很简单,只要加个注解就行了。

1. 启用缓存

首先,你得在 Spring Boot 应用里头启用缓存,用 @EnableCaching 注解标记。

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @SpringBootApplication @EnableCaching public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } |

这段代码里头,@EnableCaching 注解启用了缓存。

2. 配置缓存管理器

然后,你得配置缓存管理器,用 @Bean 注解标记。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Configuration public class CacheConfig { @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { return RedisCacheManager.builder(redisConnectionFactory) .cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()) .build(); } } |

这段代码里头,cacheManager 方法配置了一个 RedisCacheManager,用来管理缓存。

3. 使用 @Cacheable 注解

最后,你可以在 Service 里头用 @Cacheable 注解标记方法,开启缓存。

|---------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Service public class MyService { @Cacheable(value = "myCache", key = "#key") public String getValue(String key) { // 一些复杂的逻辑 return "value"; } } |

这段代码里头,getValue 方法用 @Cacheable 注解标记了,开启了缓存。value 是缓存的名字,key 是缓存的键。

五、Spring Boot 使用 Redis 缓存的坑点

1. 缓存穿透

缓存穿透是指查询一个不存在的数据,缓存里头没有,数据库里头也没有,这样每次查询都会打到数据库上。你要是没处理好,那数据库可就遭殃了。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Service public class MyService { @Cacheable(value = "myCache", key = "#key", unless = "#result == null") public String getValue(String key) { // 一些复杂的逻辑 return null; } } |

这段代码里头,unless = "#result == null" 表示如果返回值为 null,就不缓存。

2. 缓存雪崩

缓存雪崩是指缓存里头的数据大面积失效,导致大量请求直接打到数据库上。你要是没处理好,那数据库可就遭殃了。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Service public class MyService { @Cacheable(value = "myCache", key = "#key", cacheManager = "randomCacheManager") public String getValue(String key) { // 一些复杂的逻辑 return "value"; } } |

这段代码里头,cacheManager = "randomCacheManager" 表示使用随机的缓存管理器,避免缓存同时失效。

3. 缓存击穿

缓存击穿是指缓存里头的数据失效了,导致大量请求直接打到数据库上。你要是没处理好,那数据库可就遭殃了。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Java Code |
| @Service public class MyService { @Cacheable(value = "myCache", key = "#key", sync = true) public String getValue(String key) { // 一些复杂的逻辑 return "value"; } } |

这段代码里头,sync = true 表示使用同步机制,避免缓存击穿。

专有名词解释

  1. 缓存:提升系统性能的一个利器,把一些常用的数据存到内存里头,下次再用的时候直接从内存拿。
  2. 本地缓存:把数据存到应用的内存里头,速度快,但是容量有限,而且不能跨应用共享。
  3. 分布式缓存:把数据存到外部的缓存服务器里头,容量大,而且可以跨应用共享,但是速度比本地缓存慢。
  4. Redis:一个开源的、高性能的分布式缓存数据库,支持多种数据结构。
  5. RedisTemplate:Spring Boot 里头的一个类,用来操作 Redis 的。
  6. @EnableCaching:Spring Boot 里头的一个注解,用来启用缓存。
  7. CacheManager:Spring Boot 里头的一个接口,用来管理缓存。
  8. RedisCacheManager:Spring Boot 里头的一个类,用来管理基于 Redis 的缓存。
  9. @Cacheable:Spring Boot 里头的一个注解,用来开启缓存。
  10. 缓存穿透:查询一个不存在的数据,缓存里头没有,数据库里头也没有,导致每次查询都打到数据库上。
  11. 缓存雪崩:缓存里头的数据大面积失效,导致大量请求直接打到数据库上。
  12. 缓存击穿:缓存里头的数据失效了,导致大量请求直接打到数据库上。
相关推荐
paopaokaka_luck9 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
Villiam_AY12 分钟前
Redis 缓存机制详解:原理、问题与最佳实践
开发语言·redis·后端
飛_44 分钟前
解决VSCode无法加载Json架构问题
java·服务器·前端
木棉软糖3 小时前
一个MySQL的数据表最多能够存多少的数据?
java
程序视点4 小时前
Java BigDecimal详解:小数精确计算、使用方法与常见问题解决方案
java·后端
GEM的左耳返4 小时前
Java面试全攻略:Spring生态与微服务架构实战
spring boot·redis·spring cloud·微服务·kafka·java面试
愿你天黑有灯下雨有伞4 小时前
Spring Boot SSE实战:SseEmitter实现多客户端事件广播与心跳保活
java·spring boot·spring
Java初学者小白4 小时前
秋招Day20 - 微服务
java
程序员勋勋14 小时前
Redis的String数据类型底层实现
数据库·redis·缓存
YouQian7725 小时前
(AC)缓存系统
算法·缓存