Spring Boot緩存詳解

隨著應用程序越來越複雜,解決性能問題變得越來越重要。緩存是提高應用程序性能的重要方式之一。Spring Boot框架集成了多種緩存技術,使得開發人員可以快速、方便地使用緩存。本文將從多個方面詳細介紹Spring Boot緩存。

一、@Cacheable註解

Spring Boot緩存最常用的方式是使用@Cacheable註解。使用該註解可以將方法返回值緩存到內存或磁碟中,下次請求時如果參數和緩存中的一致,則直接返回緩存結果。為了使用@Cacheable註解,我們需要做以下三件事情:

1、在pom文件中引入Spring Boot的緩存依賴。例如,如果我們想使用Ehcache緩存,那麼可以使用以下依賴:

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

2、在應用程序主類上添加@EnableCaching註解。例如:

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

3、在需要緩存的方法上添加@Cacheable註解即可。例如:

@Cacheable(value = "myCache", key = "#id")
public User getUserById(Long id) {
    // 從資料庫獲取數據
    User user = userRepository.findById(id);
    return user;
}

在上面的代碼中,我們使用了value參數指定了緩存的名稱,key參數指定了緩存的鍵值。

二、緩存註解參數詳解

除了@Cacheable註解外,Spring Boot還提供了多個緩存註解,例如@CachePut、@CacheEvict、@Caching等。以下是這些緩存註解的詳細說明:

@Cacheable

該註解用於在方法調用之前,檢查緩存中是否存在請求的數據。如果緩存存在數據,則將緩存數據返回;否則會執行方法,並將執行結果存入緩存中。例如:

@Cacheable(value = "myCache", key = "#id")
public User getUserById(Long id) {
    // 從資料庫獲取數據
    User user = userRepository.findById(id);
    return user;
}

在上面的代碼中,我們使用了value參數指定了緩存的名稱,key參數指定了緩存的鍵值。

@CachePut

該註解用於在方法執行成功時,將返回值存入緩存中。例如:

@CachePut(value = "myCache", key = "#user.id")
public User updateUser(User user) {
    // 更新資料庫中的數據
    User updatedUser = userRepository.save(user);
    return updatedUser;
}

在上面的代碼中,我們使用了value參數指定了緩存的名稱,key參數指定了緩存的鍵值。

@CacheEvict

該註解用於清除指定的緩存數據。例如:

@CacheEvict(value = "myCache", key = "#id")
public void deleteUser(Long id) {
    // 從資料庫刪除數據
    userRepository.deleteById(id);
}

在上面的代碼中,我們使用了value參數指定了緩存的名稱,key參數指定了緩存的鍵值。

@Caching

該註解可以組合多種緩存註解,例如:

@Caching(
    cacheable = @Cacheable(value = "myCache", key = "#username"),
    put = @CachePut(value = "myCache", key = "#result.id"),
    evict = @CacheEvict(value = "myCache", key = "#id")
)
public User getUserByUsernameAndId(String username, Long id) {
    // 從資料庫獲取數據
    User user = userRepository.findByUsernameAndId(username, id);
    return user;
}

三、緩存管理器

Spring Boot提供了多個緩存管理器,例如Ehcache、Redis等。以下是緩存管理器的詳細說明:

Ehcache

使用Ehcache作為Spring Boot的緩存管理器,我們需要在pom文件中引入Ehcache的依賴,例如:

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

然後在應用程序配置文件application.yml中,我們需要配置Ehcache。以下是一個簡單的Ehcache配置:

spring:
  cache:
    type: ehcache

ehcache:
  config: classpath:ehcache.xml

在上面的配置中,我們使用了type參數指定了使用Ehcache作為緩存管理器,config參數指定了Ehcache的配置文件。

Redis

使用Redis作為Spring Boot的緩存管理器,我們需要在pom文件中引入Spring Boot的Redis依賴,例如:

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

然後,在應用程序配置文件application.yml中,我們需要配置Redis。以下是一個簡單的Redis配置:

spring:
  cache:
    type: redis

redis:
  host: localhost
  port: 6379
  password:
  timeout: 3000

在上面的配置中,我們使用了type參數指定了使用Redis作為緩存管理器,Redis的連接信息在redis節點中進行配置。

四、緩存管理器與多個緩存

在Spring Boot中,我們可以同時使用多個緩存管理器,並為不同的緩存使用不同的緩存管理器。以下是一個基於Ehcache和Redis緩存管理器的示例:

@Configuration
@EnableCaching
public class CacheConfig {
    @Bean
    public CacheManager ehcacheManager() {
        EhCacheCacheManager cacheManager = new EhCacheCacheManager(getEhCacheFactory().getObject());
        return cacheManager;
    }

    @Bean
    public CacheManager redisManager() {
        RedisCacheManager cacheManager = new RedisCacheManager(getRedisTemplate());
        cacheManager.setDefaultExpiration(60);
        return cacheManager;
    }

    @Bean
    public EhCacheManagerFactoryBean getEhCacheFactory() {
        EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
        factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        factoryBean.setShared(true);
        return factoryBean;
    }

    @Bean
    public RedisTemplate getRedisTemplate() {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(getRedisConnectionFactory());
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisConnectionFactory getRedisConnectionFactory() {
        LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
        connectionFactory.setHostName("localhost");
        connectionFactory.setPort(6379);
        return connectionFactory;
    }
}

在上面的代碼中,我們使用@Configuration註解和@Bean註解定義了兩個緩存管理器:ehcacheManager和redisManager。在ehcacheManager中,我們使用了EhCacheCacheManager類來定義Ehcache管理器;在redisManager中,我們使用了RedisCacheManager類來定義Redis管理器。在getEhCacheFactory和getRedisTemplate方法中,我們使用了EhCacheManagerFactoryBean和RedisTemplate類來設置Ehcache和Redis的配置信息。

當我們在使用@Cacheable註解的時候,我們可以使用value參數指定緩存的名稱,也可以使用cacheManager參數指定使用的緩存管理器。例如:

@Cacheable(value = "myCache", cacheManager = "ehcacheManager", key = "#id")
public User getUserById(Long id) {
    // 從資料庫獲取數據
    User user = userRepository.findById(id);
    return user;
}

五、緩存清理和失效

使用緩存時,我們需要注意緩存的清理和失效。以下是緩存清理和失效的說明:

手動清理緩存

我們可以使用@CacheEvict註解清理緩存,也可以使用CacheManager類的clearCache方法清理緩存。例如:

@Autowired
private CacheManager cacheManager;

// 清理所有緩存
cacheManager.getCacheNames().forEach(cacheName -> cacheManager.getCache(cacheName).clear());

// 清理指定緩存
cacheManager.getCache("myCache").clear();

// 使用@CacheEvict清理緩存
@CacheEvict(value = "myCache", allEntries = true)
public void clearCache() {
    ...
}

在上面的代碼中,我們首先使用cacheManager.getCacheNames()方法獲取所有緩存的名稱,然後在循環中使用cacheManager.getCache方法獲取每個緩存對象,最後使用clear方法清理緩存。

失效時間

我們可以使用@Cacheable註解的timeToLive參數或CacheManager類的setDefaultExpiration方法來設置緩存失效時間。例如:

@Cacheable(value = "myCache", key = "#id", timeToLive = 3600)
public User getUserById(Long id) {
    // 從資料庫獲取數據
    User user = userRepository.findById(id);
    return user;
}

@Autowired
private CacheManager cacheManager;

// 設置所有緩存的失效時間
cacheManager.setDefaultExpiration(60);

// 設置指定緩存的失效時間
cacheManager.getCache("myCache").getNativeCache().getCacheConfiguration().setTimeToLiveSeconds(3600);

在上面的代碼中,我們使用了timeToLive參數和setDefaultExpiration方法設置了緩存的失效時間。

條件失效

我們可以使用@CachePut註解的condition參數來定義緩存的條件失效。例如,我們可以在更新用戶信息的方法中,只有在用戶數據發生變化時才更新緩存:

@CachePut(value = "myCache", key = "#user.id", condition = "#user.changed == true")
public User updateUser(User user) {
    // 更新資料庫中的數據
    User updatedUser = userRepository.save(user);
    // 標記變化
    updatedUser.setChanged(true);
    return updatedUser;
}

六、緩存監控

Spring Boot提供了多種工具來監控緩存,例如Actuator、Micrometer等。以下是緩存監控的詳細說明:

Actuator

Spring Boot Actuator是Spring Boot的生產環境管理工具,提供了對應用程序的監控和管理功能。我們可以使用Actuator來監控應用程序中緩存的使用情況。例如,在瀏覽器中訪問URL http://localhost:8080/actuator/caches/可以查看當前應用程序中所有緩存的使用情況:

{
"cacheManagers": {
"cacheManager": {
"caches": {
"myCache": {
"target": {
"class": "org.springframework.data.redis.cache.RedisCache",
"name": "myCache",
"cache": {
"cacheName": "myCache",
"nativeCache": {
"name": "myCache",
"cacheLoader": null,
"cacheWriter": null,
"evictionAdvisor": null,
"initializer": null,
"loaderWriterMutex": {},
"stats": {
"cacheHits": 1,

原創文章,作者:ZMHCR,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/369497.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZMHCR的頭像ZMHCR
上一篇 2025-04-13 11:45
下一篇 2025-04-13 11:45

相關推薦

發表回復

登錄後才能評論