金歌 发表于 2024-7-10 22:49:01

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
[*]集合操作:#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安装与设置:
   这里可以自行查找文章举行安装和设置,网上优质文章很多
页: [1]
查看完整版本: SpringBoot系列——使用Spring Cache和Redis实现查询数据缓存