ToB企服应用市场:ToB评测及商务社交产业平台
标题:
SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存
[打印本页]
作者:
金歌
时间:
2024-7-10 22:49
标题:
SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存
1. 前言
在现代应用程序中,查询缓存的使用已经变得越来越普遍。它不仅能够显著提高体系的性能,还能提升用户体验。缓存通过在内存中存储频繁访问的数据,减少对数据库或其他存储体系的访问,从而加快数据读取速度。在这篇文章中,我们将探究缓存的根本概念、重要性以及怎样使用Spring Cache和Redis实现查询数据缓存 。
2. 缓存
2.1 什么是缓存
缓存
是一种暂时存储机制,用于在内存中生存频繁访问的数据。它可以是硬件(如CPU缓存)或软件(如应用程序缓存)。缓存的重要目标是通过减少数据访问的耽误,提高体系的相应速度。以下是缓存的一些关键特性:
暂时性
:缓存中的数据通常是暂时的,会在一段时间后失效或被替换。
快速访问
:由于缓存数据存储在内存中,访问速度非常快。
空间有限
:缓存的存储空间通常有限,因此必要有效的管理策略,如LRU(近来最少使用)策略。
2.2 使用缓存的好处
提高性能
:缓存可以显著减少数据读取的时间,因为内存访问速度比硬盘或网络存储快很多。
减轻数据库负载
:缓存可以减少数据库的查询次数,从而减轻数据库的负载,提升团体体系的稳固性和可扩展性。
节流资源
:通过减少对后端体系的访问,缓存可以帮助节流带宽和盘算资源。
提高用户体验
:快速的数据访问可以显著提升用户体验,特殊是在必要频繁读取数据的应用场景中。
2.3 缓存的本钱
内存斲丧
:缓存必要占用体系的内存资源,过多的缓存大概会影响其他应用程序的性能。
数据一致性
:缓存中的数据大概会与数据库中的数据不一致,尤其是在数据频繁更新的场景中。必要设计有效的缓存失效策略来保证数据的一致性。
复杂性增加
:引入缓存机制会增加体系的复杂性,必要处理缓存的管理、更新和失效等问题。
维护本钱
:缓存体系必要定期监控和维护,以确保其高效运行。
2.4 Spring Cache和Redis的长处
为了实现高效的数据缓存,Spring Boot提供了Spring Cache模块,而Redis则是一个强盛的缓存数据库。结合使用Spring Cache和Redis,能够充分发挥二者的长处,实现高效的数据缓存。
Spring Cache的长处
:
简化缓存操作
:Spring Cache提供了一系列注解(如@Cacheable、@CachePut、@CacheEvict),简化了缓存的使用,使开发者能够专注于业务逻辑。
灵活的缓存管理
:Spring Cache支持多种缓存提供者(如EhCache、Hazelcast、Redis等),可以根据具体需求选择合适的缓存实现。
透明的缓存机制
:Spring Cache使得缓存操作对业务代码透明,开发者无需关心缓存的具体实现细节。
Redis的长处
:
高性能
:由于数据存储在内存中,Redis的读写速度非常快,能够处理每秒数百万级别的请求。
丰富的数据结构
:Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,能够满意不同场景下的数据存储需求。
持久化支持
:固然Redis重要用于内存存储,但它也提供了数据持久化的功能,可以将数据定期生存到磁盘,防止数据丢失。
分布式支持
:Redis支持主从复制、哨兵模式和集群模式,能够实现高可用性和数据的水平扩展。
灵活的逾期策略
:Redis支持为每个键设置逾期时间,自动删除逾期数据,方便实现缓存失效策略。
3. Spring Cache底子知识
在Spring Boot中,Spring Cache提供了一套简洁且强盛的缓存抽象机制,帮助开发者轻松地将缓存集成到应用程序中。以下是Spring Cache的一些核心概念和常用注解。
3.1 Spring Cache的核心概念
CacheManager
定义
:CacheManager是Spring Cache的核心接口,负责管理多个缓存实例。它是缓存操作的入口点,提供了获取和操作缓存实例的方法。
实现
:Spring提供了多种CacheManager实现,如ConcurrentMapCacheManager、EhCacheCacheManager、RedisCacheManager等。不同的实现实用于不同的缓存存储机制。
Cache
定义
:Cache是缓存的具体实现,负责存储和检索缓存数据。它提供了根本的缓存操作,如put、get、evict等。
实现
:具体的Cache实现依靠于底层的缓存存储机制,如内存缓存、Redis缓存等。
3.2 Spring Cache的注解
3.2.1 SpEL表达式
因为Spring Cache使用SpEL表达式来动态生成缓存键,以是在学习Spring Cache的注解之前我们还要先简朴相识一下SpEL表达式的语法,这部分可以先不看懂,在背面看注解的时候返来看即可。
SpEL表达式的语法雷同于Java的表达式语法,支持以下几种操作:
字面量
:
数字:1, 2.5
字符串:'hello', "world"
布尔值:true, false
空值:null
属性和方法
:
访问对象的属性:#user.name
调用对象的方法:#user.getName()
运算符
:
算术运算:+, -, *, /, %
比较运算:==, !=, <, >, <=, >=
逻辑运算:&&, ||, !
集合和数组
:
访问集合元素:#users[0]
集合操作:#users.size(), #users.isEmpty()
条件运算符
:
三元运算符:condition ? trueValue : falseValue
Elvis运算符:expression ?: defaultValue
变量
:
定义和使用变量:#variableName
接下来进入Spring Cache注解的学习:
3.2.2 @Cacheable
作用
:@Cacheable注解用于标注必要缓存的方法。当该方法被调用时,Spring Cache会先查抄缓存中是否存在对应的数据。如果存在,则直接返回缓存数据;如果不存在,则执行方法并将结果存入缓存。
示例
:
@RestController("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@Cacheable(value = "user", key = "#id")
public User getUser(Long id) {
// 获取用户的逻辑
return userService.findById(id);
}
}
复制代码
参数
:
value:指定缓存的名称。
key:指定缓存的键,可以使用SpEL表达式。
3.2.3 @CachePut
作用
:@CachePut注解用于标注必要更新缓存的方法。即使缓存中已经存在数据,该方法仍然会执行,并将结果更新到缓存中。
示例
:
@RestController("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@CachePut(value = "user", key = "#user.id")
public User updateUser(User user) {
// 更新用户的逻辑
return userService.save(user);
}
}
复制代码
参数
:
value:指定缓存的名称。
key:指定缓存的键,可以使用SpEL表达式。
3.2.4 @CacheEvict
作用
:@CacheEvict注解用于标注必要扫除缓存的方法。当该方法被调用时,Spring Cache会扫除对应的缓存数据。
示例
:
@RestController("/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@CacheEvict(value = "user", key = "#id")
public void deleteUser(Long id) {
// 删除用户的逻辑
userService.deleteById(id);
}
}
复制代码
参数
:
value:指定缓存的名称。
key:指定缓存的键,可以使用SpEL表达式。
allEntries:如果设置为true,则扫除缓存中的所有数据。
4. 实现查询数据缓存
4.1 准备工作
Redis安装与设置:
这里可以自行查找文章举行安装和设置,网上优质文章很多
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4