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

SpringCache初学者指南:快速入门与实践

概述

本文介绍了SpringCache的基本概念和使用方法,包括其主要作用和优势,如提高应用性能、减少数据库访问等。文章详细讲解了SpringCache的配置和核心注解,例如@Cacheable、@CachePut和@CacheEvict等,并提供了不同的缓存实现示例,如Ehcache、Redis和ConcurrentMap。此外,还介绍了如何自定义缓存管理器和解析器。SpringCache通过简单的注解配置,能够有效提升应用程序的性能。

SpringCache初学者指南:快速入门与实践
SpringCache简介

什么是SpringCache

Spring Cache 是一个针对缓存的抽象层,它提供了多种缓存管理器的实现,使得开发者可以更加方便地使用不同的缓存技术。它支持多种缓存实现,如EHCache、Redis、ConcurrentMap等。

SpringCache的主要作用

Spring Cache 主要用于提高应用的性能和响应速度。通过缓存机制,可以避免频繁访问资源或数据库,从而减少系统的负担,提高应用的响应速度。例如,对于一些数据访问密集型的应用,可以通过缓存机制来减少数据库的读写操作,提高应用的性能。

SpringCache的优势

  1. 灵活性:Spring Cache 支持多种缓存实现,开发者可以根据实际需求选择最适合的缓存。
  2. 简洁性:Spring Cache 提供了许多注解,可以方便地在代码中定义缓存逻辑。
  3. 可配置性:提供丰富的配置选项,可以针对不同的缓存实现进行优化。
SpringCache的基本配置

添加SpringCache依赖

在开始使用 Spring Cache 之前,需要先在项目中添加 Spring Cache 的依赖。这可以通过以下方式在 Maven 项目的 pom.xml 文件中添加:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.10</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.3.10</version>
</dependency>

配置缓存管理器

Spring Cache 需要一个缓存管理器来管理缓存的创建、读取和删除等操作。在 Spring 中,可以通过 CacheManager 接口来创建缓存管理器。例如,使用 SimpleCacheManager 实现:

import org.springframework.cache.CacheManager;
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("cache1"), new ConcurrentMapCache("cache2")));
        return cacheManager;
    }
}

配置缓存注解支持

要使用 Spring Cache 的注解功能,需要在 Spring 配置类中开启缓存注解的支持。

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class AppConfig {
}
SpringCache的核心注解

@Cacheable注解详解

@Cacheable 注解用于方法或类,表示该方法或类的返回值会被缓存。当调用被 @Cacheable 注解的方法时,Spring 会先检查缓存中是否存在该方法的返回值,如果存在,则直接返回缓存中的值;否则,调用方法并将返回值存入缓存中。

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

@Service
public class UserService {

    @Cacheable(value = "users", key = "#id")
    public User getUserById(int id) {
        // 从数据库中获取用户信息
        return new User(id, "user" + id);
    }
}

@CachePut注解详解

@CachePut 注解用于方法上,表示该方法的返回值会被更新到缓存中,但不会影响方法的执行。也就是说,无论缓存中是否存在该方法的返回值,都会执行该方法并将结果存入缓存中。

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

@Service
public class UserService {

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        // 更新数据库中的用户信息
        return user;
    }
}

@CacheEvict注解详解

@CacheEvict 注解用于方法上,表示该方法会清除缓存中的某些条目。常见的用法是删除某个条目或清空整个缓存。

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

@Service
public class UserService {

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(int id) {
        // 从数据库中删除用户信息
    }
}

@Caching注解详解

@Caching 注解用于在一个方法上同时应用多个缓存操作。例如,可以同时使用 @Cacheable@CacheEvict 注解。

import org.springframework.cache.annotation.*;

@Service
public class UserService {

    @Caching(
        put = @CachePut(value = "users", key = "#user.id"),
        evict = @CacheEvict(value = "users", key = "#id")
    )
    public User updateUser(User user, int id) {
        // 更新数据库中的用户信息
        return user;
    }
}
SpringCache的常用缓存实现

使用Ehcache作为缓存实现

Ehcache 是一个广泛使用的缓存实现,可以作为一个独立的库使用,也可以作为 Spring Cache 的实现之一。配置 Ehcache 作为缓存管理器:

import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
        EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
        factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
        return factory;
    }

    @Bean
    public CacheManager cacheManager(EhCacheManagerFactoryBean ehCacheManagerFactoryBean) {
        return new EhCacheCacheManager(ehCacheManagerFactoryBean.getObject());
    }
}

使用Redis作为缓存实现

Redis 是一个高性能的键值存储系统,可以作为分布式缓存系统使用。配置 Redis 作为缓存管理器:

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        cacheManager.setUsePrefix(true);
        return cacheManager;
    }
}

使用ConcurrentMap作为缓存实现

如果只是在单机环境下使用缓存,可以使用 ConcurrentMap 作为缓存实现。配置 ConcurrentMap 作为缓存管理器:

import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

    @Bean
    public ConcurrentMapCacheFactoryBean cacheFactoryBean() {
        ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean();
        cacheFactoryBean.setName("users");
        cacheFactoryBean.setCacheManager(new SimpleCacheManager());
        cacheFactoryBean.afterPropertiesSet();
        return cacheFactoryBean;
    }

    @Bean
    public CacheManager cacheManager(ConcurrentMapCacheFactoryBean cacheFactoryBean) {
        ConcurrentMapCacheFactoryBean factory = cacheFactoryBean;
        factory.afterPropertiesSet();
        ConcurrentMapCache cache = factory.getObject();
        return new SimpleCacheManager(Arrays.asList(cache));
    }
}
SpringCache的自定义配置

自定义缓存管理器

Spring Cache 允许开发者自定义缓存管理器的实现。自定义缓存管理器可以更好地适应项目的特定需求。

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching
public class CustomCacheConfig {

    @Bean
    public CacheManager cacheManager() {
        return new CustomCacheManager();
    }
}

自定义缓存解析器

缓存解析器负责将方法的参数解析为缓存的键。自定义缓存解析器可以实现特定的键生成逻辑。

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheResolver;
import org.springframework.cache.interceptor.SimpleCacheResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CustomCacheResolverConfig {

    @Bean
    public CacheResolver customCacheResolver() {
        return new CustomCacheResolver(new SimpleCacheManager());
    }

    public static class CustomCacheResolver extends SimpleCacheResolver {

        @Override
        public Collection<? extends Cache> resolveCaches(Method method, Object... arguments) {
            // 自定义缓存键生成逻辑
            return Collections.singletonList(new ConcurrentMapCache("customCache"));
        }
    }
}

自定义缓存注解

自定义缓存注解可以扩展 Spring Cache 的功能,使其更加符合项目的特定需求。

import org.springframework.cache.annotation.Cacheable;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Cacheable
public @interface CustomCacheable {
    String value() default "";
    String key() default "";
}
SpringCache的实践案例

缓存基本用法案例

在实际项目中,可以通过以下几个步骤来实现缓存的基本用法。

  1. 添加 Spring Cache 依赖
    如前所述,在 pom.xml 文件中添加所需的依赖。

  2. 配置缓存管理器
    使用 SimpleCacheManager 或其他缓存管理器的实现。

  3. 定义缓存注解
    使用 @Cacheable 注解来定义缓存逻辑。
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "users", key = "#id")
    public User getUserById(int id) {
        // 从数据库中获取用户信息
        return new User(id, "user" + id);
    }
}

缓存失效策略案例

缓存失效策略是缓存机制中非常重要的一部分。常见的失效策略包括时间失效、条件失效等。

  1. 时间失效
    通过设置缓存的过期时间,使缓存在指定时间后失效。
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "users", key = "#id", cacheManager = "timeoutCacheManager", cacheResolver = "timeoutCacheResolver")
    public User getUserById(int id) {
        // 从数据库中获取用户信息
        return new User(id, "user" + id);
    }
}
  1. 条件失效
    通过配置条件,使缓存在满足特定条件时失效。
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable(value = "users", key = "#id", unless = "#result == null")
    public User getUserById(int id) {
        // 从数据库中获取用户信息
        return new User(id, "user" + id);
    }
}

缓存更新策略案例

缓存更新策略是缓存机制中另一个重要的部分。常见的更新策略包括缓存更新、缓存删除等。

  1. 缓存更新
    使用 @CachePut 注解来更新缓存中的条目。
import org.springframework.cache.annotation.CachePut;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {
        // 更新数据库中的用户信息
        return user;
    }
}
  1. 缓存删除
    使用 @CacheEvict 注解来删除缓存中的条目。

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

@Service
public class UserService {

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(int id) {
        // 从数据库中删除用户信息
    }
}
``

以上是 Spring Cache 的一些基本概念和实践案例。通过合理地使用缓存,可以显著提高应用的性能和响应速度,减少系统的负担。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消