什么是Spring Cache?Spring项目如何使用?

这篇具有很好参考价值的文章主要介绍了什么是Spring Cache?Spring项目如何使用?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

目前Spring Cloud微服务在Web项目中占据了主流地位,如果去面试关于Spring Cloud的岗位时,面试官一般都会提问你的项目是如何优化的,从哪些方面入手去优化。而缓存技术绝对是项目必不可少的,所以我们必须掌握好Java项目的缓存技术。

目前,在 Java 中,常见的缓存有以下几种:

  1. JVM 缓存:JVM 缓存是指 Java 虚拟机为类加载器所创建的缓存。Java 虚拟机通过缓存已经加载的类来提高应用程序的性能。
  2. 数据库缓存:数据库缓存是指将查询结果缓存在内存中,以便下次查询时可以直接从内存中获取,避免了重复查询数据库的操作。
  3. Web 缓存:Web 缓存是指将 Web 页面、图片等静态资源缓存到本地,以便下次访问时可以直接从本地获取,提高 Web 应用程序的性能。
  4. 分布式缓存:分布式缓存是指将数据缓存到多个节点上,以便多个应用程序可以共享缓存,提高系统的性能和可伸缩性。
  5. 本地缓存:本地缓存是指将数据存储在应用程序本地的内存或磁盘上,以便快速读取和更新数据,避免了频繁访问远程资源的开销。
  6. Spring 缓存:Spring 框架提供了一套缓存框架,可以将方法调用的结果缓存到内存或磁盘中,以便下次调用时可以直接从缓存中获取结果,提高应用程序的性能。

今天我主要讲解Spring 缓存,因为Spring cache简单、方便、效率高,绝对是Spring Cloud微服务项目的最佳选择

一、什么是Spring Cache

Spring Cache是Spring框架中的一个模块,它提供了一种简单的方法来缓存数据和对象。通过使用Spring Cache,开发人员可以将常用的数据和对象存储在内存中,以提高应用程序的性能和响应速度。

Spring Cache支持多种缓存实现,包括内存、Redis、Memcached等。开发人员可以根据自己的需求选择合适的缓存实现。

Spring Cache还提供了一些高级功能,如缓存预热、缓存过期、分布式缓存等,使得开发人员可以更加灵活地使用缓存。同时,Spring Cache还与Spring框架的其他模块集成良好,可以方便地与其他组件一起使用。

1、优点

  • 提高性能:通过将常用的数据和对象存储在内存中,Spring Cache可以大大提高应用程序的性能和响应速度。

  • 简化代码:Spring Cache提供了一些高级功能,如缓存预热、缓存过期和分布式缓存等,使得开发人员可以更加灵活地使用缓存,从而简化了代码。

  • 促进团队协作:Spring Cache可以促进团队协作,因为它可以在多个开发人员之间共享缓存数据,从而减少了重复的工作和代码冗余。

  • 实现分布式系统:Spring Cache可以与Spring框架的其他模块集成良好,可以方便地与其他组件一起使用,从而实现分布式系统。

  • 支持多种缓存实现:Spring Cache支持多种缓存实现,包括内存、Redis、Memcached等,开发人员可以根据自己的需求选择合适的缓存实现。

  • 提供基本的Cache抽象:方便切换各种底层Cache,通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成。

  • 提供事务回滚时也自动回滚缓存:支持比较复杂的缓存逻辑。

  • 通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成。

2、缺点

在使用 Spring Cache 时,可能会遇到一些不足之处。下面是一些可能的不足:

  • 读模式下缓存失效的问题:在 Spring Cache 中,缓存的读模式下可能会出现缓存失效的问题。这是因为在读模式下,缓存的数据可能会过期,导致缓存失效。为了解决这个问题,可以使用 Spring Cache 提供的读写分离功能,将读请求和写请求分别发送到不同的 Cache 实例。
  • 缓存穿透:在某些情况下,缓存穿透可能会发生。这是因为在读模式下,缓存的数据可能会被其他组件重新读取,导致缓存穿透。为了避免缓存穿透,可以使用 Spring Cache 提供的写模式,并设置 cache-null-values: true 来允许写入空值。
  • 缓存击穿:在大量并发请求的情况下,可能会出现缓存击穿的问题。这是因为在这种情况下,同时有大量的请求查询一个正好过期的数据,导致请求全部转发到数据库,从而导致数据库压力过大。为了避免缓存击穿,可以设置缓存的过期时间,或者使用其它缓存框架,如 Ehcache 或 RedisCache。
  • 缓存雪崩:在某些情况下,缓存的大量键过期时间相同,导致某一刻缓存同时失效,请求全部转发到数据库。为了避免缓存雪崩,可以使用 Spring Cache 提供的键值哈希策略,将键值哈希到不同的桶中,避免键值过期时间相同的问题。
  • 总的来说,Spring Cache 在处理读模式下缓存失效、缓存穿透、缓存击穿和缓存雪崩等问题方面表现良好,但在写模式下需要使用其他方式进行处理。使用 Spring Cache 可以轻松地管理和优化应用程序的缓存。

二、Spring Cache原理

1、基本流程图

什么是Spring Cache?Spring项目如何使用?

2、原理

当我们在Spring中使用缓存时,会按照以下步骤进行操作:

  • 首先,Spring会检查是否使用了缓存注解。如果使用了,那么会在缓存的缓存管理器中查找是否有已经缓存的数据。

  • 如果缓存管理器中没有对应的缓存数据,那么会执行方法体中的代码,并将结果缓存起来。

  • 如果缓存管理器中已经存在缓存数据,那么直接返回缓存数据。

当我们在更新数据时,会按照以下步骤进行操作:

  • 首先,更新方法会执行,然后会更新数据库中的数据。

  • 然后,Spring会在缓存管理器中查找是否存在已经缓存的数据。

  • 如果存在缓存数据,那么会将缓存数据删除。

  • 下一次查询时,会重新执行方法体中的代码,并将新的结果缓存起来。

以上就是Spring Cache的工作原理。

三、Spring Cache具体实现与应用

1、引入SpringCache依赖

  • .引入SpringCache依赖
<!--Spring Cache,使用注解简化开发-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

-.引入redis依赖

<!--redis启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、属性配置

spring:
  redis:
    host: 192.168.56.10
    port: 6379
  cache:
    type: redis # 使用redis作为缓存
    redis:
      time-to-live: 3600s # 过期时间
      # key-prefix: CACHE_ # 会导致自己在@Cacheable里设置的名字失效,所以这里不指定
      use-key-prefix: true # key值加前缀
      cache-null-values: true # 缓存控制

3、类配置

@EnableConfigurationProperties(CacheProperties.class)
@EnableCaching
@Configuration
public class MyCacheConfig {

//    @Autowired
//    CacheProperties cacheProperties;

    /**
     * 需要将配置文件中的配置设置上
     * 1、使配置类生效
     * 1)开启配置类与属性绑定功能EnableConfigurationProperties
     *
     * @ConfigurationProperties(prefix = "spring.cache")  public class CacheProperties
     * 2)注入就可以使用了
     * @Autowired CacheProperties cacheProperties;
     * 3)直接在方法参数上加入属性参数redisCacheConfiguration(CacheProperties redisProperties)
     * 自动从IOC容器中找
     * <p>
     * 2、给config设置上
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

        //序列化key,不变
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        //序列化值,使用json
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        // 当自己往IOC注入了RedisCacheConfiguration配置类时,以下参数全都失效,需要手动设置
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }
        return config;
    }
}

4、查询时读取缓存

 @Cacheable(value = {"category"}, key = "#root.method.name", sync = true)
    @Override
    public List<CategoryEntity> getLevel1Categorys() {
        System.out.println("调用了getLevel1Categorys...");
        // 查询父id=0
        return baseMapper.selectList(new QueryWrapper<CategoryEntity>().eq("parent_cid", 0));
    }

5、更新时读取缓存

@CacheEvict(value = {"category"}, allEntries = true) //删除category分区里所有的缓存
    @Transactional
    @Override
    public void updateCascade(CategoryEntity category) {
        this.updateById(category);
        if (!StringUtils.isEmpty(category.getName())) {
            // 更新冗余表
            categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());
            // TODO 更新其他冗余表
        }       
    }

6、双写模式

/**
 * 级联更新
 * 缓存策略:双写模式,方法执行完更新缓存
 */
@CachePut(value = "category", key = "'level1Categorys'")
@Transactional
@Override
public void updateCascade(CategoryEntity category) {
    this.updateById(category);
    if (!StringUtils.isEmpty(category.getName())) {
        // 更新冗余表
        categoryBrandRelationService.updateCategory(category.getCatId(), category.getName());
        // TODO 更新其他冗余表
    }
}

7、注解解释:

@Cacheable:更新缓存【读操作:如果当前缓存存在方法不被执行,不存在则执行get方法并更新缓存】
@CacheEvict:删除缓存【写操作:失效模式,方法执行完删除缓存】
@CachePut:更新缓存【写操作:双写模式,方法执行完更新缓存】
@Caching:组合以上多个缓存操作
@CacheConfig:在类级别共享缓存的相同配置

源码下载:
gitee.com/charlinchenlin/koo-erp文章来源地址https://www.toymoban.com/news/detail-451954.html

到了这里,关于什么是Spring Cache?Spring项目如何使用?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring cache 学习 —— @Cacheable 使用详解

    @Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。 注意,这里强调了一点:参数相同。 这一点应该是很容易理解的,因为缓存不

    2024年02月03日
    浏览(32)
  • 使用Spring Cache优化数据库访问

    在这篇博客中,我们将学习如何使用Spring Cache来优化数据库访问,提高系统性能。我们将创建一个简单的图书管理应用作为示例,并演示如何通过缓存减少对数据库的频繁查询。 首先,我们看一下项目的基本结构: 我们使用了Spring Boot和Spring Data JPA来简化项目配置。以下是主

    2024年02月02日
    浏览(30)
  • Spring Cache的介绍以及怎么使用(redis)

    1、Spring Cache介绍 Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能. Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过 CacheManager 接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口

    2024年02月11日
    浏览(34)
  • 【SpringBoot篇】使用Spring Cache高效处理缓存数据

    Spring Cache是一个框架,只要简单加一个注解,就能实现缓存功能。Spring Cache是Spring Framework提供的一个模块,它为应用程序添加了缓存支持。通过使用Spring Cache,你可以在方法级别上定义缓存规则,将方法的返回结果缓存起来,以提高方法调用的性能和响应速度。 是一个框架,只要简

    2024年02月05日
    浏览(44)
  • Spring Cache的介绍以及使用方法、常用注解

    Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能. Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。 CacheManager是Spring提供的各种缓存技术抽象接口。 针对不同的缓存

    2024年02月16日
    浏览(28)
  • Spring 项目过程及如何使用 Spring

    下面使用 Maven 的方式创建 Spring 项目,主要分为三步走: 创建一个普通的 Maven 项目 添加 Spring 框架支持(spring-context、spring-beans) 添加启动类 之后会进入一个修改项目名称的页面: Spring 框架支持添加到 pom.xml 这个文件当中,添加的内容我放在下面,这里不用记,不用记,

    2024年02月11日
    浏览(22)
  • spring boot整合cache使用Ehcache 进行数据缓存

    之前的文章 spring boot整合 cache 以redis服务 处理数据缓存 便捷开发 带着大家通过spring boot整合了 cache 缓存 那么 我们就来说说 其他服务的缓存 而spring boot默认的缓存方案就是 cache 用simple模式 spring boot的强大在于它的整合能力 它将其他缓存技术整合 统一了接口 简单说 所有的

    2024年02月19日
    浏览(32)
  • Spring Boot 中的 MyBatis 是什么,如何使用

    MyBatis 是一种流行的 Java 持久化框架,可以将 SQL 查询映射到对象上,并提供了简单易用的 API 来执行 CRUD 操作。Spring Boot 可以与 MyBatis 集成,提供了简化配置和自动化配置的功能,使得使用 MyBatis 变得更加容易。 在本文中,我们将介绍 Spring Boot 中的 MyBatis,包括如何配置和使

    2024年02月16日
    浏览(30)
  • Spring Boot中的Hibernate是什么,如何使用

    Hibernate是一个流行的Java ORM框架,它提供了一种将Java对象映射到关系数据库表的方法。Spring Boot集成了Hibernate,使得在开发Web应用程序时可以轻松地使用Hibernate操作数据库。本文将介绍Spring Boot中的Hibernate是什么以及如何使用。 Hibernate是一个流行的Java ORM框架,它提供了一种将

    2024年02月13日
    浏览(35)
  • Spring Boot 中的 TransactionTemplate 是什么,如何使用

    事务管理是任何应用程序中至关重要的部分,特别是在处理数据库操作时。Spring Boot提供了多种方式来管理事务,其中之一是使用 TransactionTemplate 。本文将深入探讨 TransactionTemplate 是什么,以及如何在Spring Boot中使用它来简化事务管理。 TransactionTemplate 是Spring框架中的一个类,

    2024年02月02日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包