为了账号安全,请及时绑定邮箱和手机立即绑定

SpringCache入门:轻松掌握Spring缓存机制

标签:
Spring
概述

Spring Cache入门介绍了Spring框架中缓存的集成与使用,包括依赖引入、配置方法和常见注解的使用。文章详细讲解了如何通过简单的注解和配置来简化缓存操作,同时提供了多种应用场景和示例代码,帮助开发者快速上手Spring Cache。

引入SpringCache

SpringCache简介

Spring Cache是Spring框架提供的一套用于集成缓存的抽象层。它简化了缓存的使用,使得开发者能够通过简单的注解和配置来使用各种缓存技术(如Ehcache、Redis等)。Spring Cache通过提供统一的接口来管理和操作缓存,从而提高了代码的可维护性和可扩展性。

SpringCache的优势与应用场景

优势

  1. 简化缓存使用:通过注解和配置简化了缓存的使用,使代码更加简洁。
  2. 统一接口:提供统一的缓存接口,支持多种缓存实现(如Ehcache、Redis等)。
  3. 灵活配置:缓存策略、缓存失效时间等都可以灵活配置。
  4. 减少数据库压力:通过缓存减少对数据库的直接访问,提高系统性能。

应用场景

  1. 减少重复计算:缓存频繁调用且计算昂贵的方法的结果。
  2. 提高响应速度:缓存读操作结果,减少数据库访问时间。
  3. 减轻数据库压力:通过缓存减轻数据库的读写操作。
  4. 提升用户体验:减少等待时间和提高响应速度,从而提升用户体验。

引入SpringCache依赖

在项目中引入Spring Cache依赖,可以在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

对于使用Maven的项目,直接在pom.xml文件中添加上述依赖即可。对于Gradle项目,可以在build.gradle文件中添加如下依赖:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-cache'
}
配置SpringCache

编写配置文件

在Spring项目中,可以通过配置文件来配置Spring Cache。配置文件通常位于src/main/resources目录下,并命名如application.propertiesapplication.yml

application.properties示例

# 配置缓存管理器
spring.cache.type=simple
# 配置缓存失效时间
spring.cache.cache-names=exampleCache
spring.cache.expiry=300

application.yml示例

spring:
  cache:
  type: simple
  cache-names: exampleCache
  expiry: 300

使用注解进行简单配置

在Spring中,可以通过注解来配置缓存。最常用的注解包括@EnableCaching@Cacheable@CachePut@CacheEvict等。

1. 启动缓存注解

要使用Spring Cache注解,需要在Spring Boot的主类上添加@EnableCaching注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class CacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class, args);
    }
}

2. 使用@Cacheable注解

@Cacheable用于标记方法,表示该方法的结果会被缓存起来。当方法被调用时,会先从缓存中查找结果,如果找到则直接返回缓存中的值,否则执行方法并缓存结果。

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class CacheService {

    @Cacheable(value = "exampleCache", key = "#id")
    public String getDataById(String id) {
        // 模拟数据获取
        return "Data for id: " + id;
    }
}

常见的SpringCache配置参数

1. valuecacheNames

指定缓存的名称。可以指定一个或多个缓存名。

@Cacheable(value = "exampleCache")

2. key

提供自定义缓存键。可以是一个SpEL表达式,也可以是一个值。

@Cacheable(value = "exampleCache", key = "#id")

3. condition

指定一个SpEL表达式,当条件为true时,才会将数据放入缓存。

@Cacheable(value = "exampleCache", key = "#id", condition = "#id != null")
使用SpringCache注解

@Cacheable注解的使用

@Cacheable注解用于标记方法,表示该方法的结果会被缓存起来。当方法被调用时,会先从缓存中查找结果,如果找到则直接返回缓存中的值,否则执行方法并缓存结果。

示例

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(String id) {
        // 模拟数据获取
        return new User(id, "张三");
    }
}

@CachePut注解的使用

@CachePut注解用于更新缓存。每当被@CachePut注解的方法被调用时,都会执行方法并更新缓存,即使该方法的结果已经在缓存中存在。

示例

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CachePut(value = "userCache", key = "#id")
    public User updateUserById(String id, User user) {
        // 模拟数据更新
        return user;
    }
}

@CacheEvict注解的使用

@CacheEvict注解用于清除缓存。可以指定清除单个缓存项或整个缓存。

示例

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "userCache", key = "#id")
    public void deleteUserById(String id) {
        // 模拟数据删除
    }
}
自定义缓存管理器

创建自定义缓存管理器

Spring允许开发者自定义缓存管理器来实现特定的缓存策略。可以通过继承org.springframework.cache.CacheManager接口来自定义缓存管理器。

示例

import org.springframework.cache.CacheManager;
import org.springframework.cache.Cache;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(
                new ConcurrentMapCache("exampleCache"),
                new ConcurrentMapCache("anotherCache")
        ));
        return cacheManager;
    }
}

自定义缓存管理器的配置与使用

自定义缓存管理器可以通过配置文件或代码来设置各个缓存的属性,如缓存名称、缓存失效时间等。

配置文件示例

# 配置缓存管理器
spring.cache.type=simple
spring.cache.cache-names=userCache,anotherCache
spring.cache.expiry=300

代码示例

import org.springframework.cache.CacheManager;
import org.springframework.cache.Cache;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(Arrays.asList(
                new ConcurrentMapCache("exampleCache"),
                new ConcurrentMapCache("anotherCache")
        ));
        return cacheManager;
    }
}
实战案例解析

创建缓存示例程序

案例描述

假设有一个获取用户信息的接口,该接口频繁被调用,每次查询都直接从数据库获取数据,消耗了大量资源。通过使用Spring Cache,可以将用户信息缓存起来,从而减少数据库访问。

实现步骤

  1. 创建缓存服务
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(String id) {
        // 模拟数据库查询
        return new User(id, "张三");
    }
}
  1. 创建用户实体类
public class User {
    private String id;
    private String name;

    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}
  1. 配置缓存

application.properties中配置缓存:

# 配置缓存管理器
spring.cache.type=simple
spring.cache.cache-names=userCache
spring.cache.expiry=300

注解的综合使用实践

示例

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(String id) {
        // 模拟数据库查询
        return new User(id, "张三");
    }

    @CachePut(value = "userCache", key = "#id")
    public User updateUserById(String id, User user) {
        // 模拟数据更新
        return user;
    }

    @CacheEvict(value = "userCache", key = "#id")
    public void deleteUserById(String id) {
        // 模拟数据删除
    }
}

缓存失效与更新策略

缓存失效策略

缓存失效策略通常包括缓存时间过期、缓存项被替换等。

  1. 缓存时间过期
# 配置缓存管理器
spring.cache.type=simple
spring.cache.cache-names=userCache
spring.cache.expiry=300
  1. 缓存项被替换

使用ConcurrentMapCache时,当缓存项数量超过最大数量时,会自动替换最旧的缓存项。

缓存更新策略

  1. 自动更新

使用@CachePut注解,每次调用方法时都会更新缓存。

import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CachePut(value = "userCache", key = "#id")
    public User updateUserById(String id, User user) {
        // 模拟数据更新
        return user;
    }
}
  1. 手动更新

使用@CacheEvict注解清除缓存,再调用方法更新缓存。

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "userCache", key = "#id")
    public void deleteUserById(String id) {
        // 模拟数据删除
    }
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消