Spring框架学习之Cache抽象详解
什么是Cache抽象
Cache 抽象是 Spring 框架为了简化缓存的使用而提供的一种抽象层,它定义了 Spring 缓存的公共 API,并且提供了对不同缓存系统的支持。通过在 Cache 抽象上编程,应用程序开发人员可以将其应用程序代码与底层缓存实现解耦,从而使系统更加可维护和可扩展。
Cache 抽象的核心接口
-
org.springframework.cache.Cache
接口:代表一个缓存的抽象,定义了从缓存中读取、写入、删除的方法。 -
org.springframework.cache.CacheManager
接口:代表缓存管理器的抽象,可以被应用程序用来配置和获取不同的缓存。
Spring 支持的缓存类型
-
ConcurrentHashMap:基于 Java 自带的 ConcurrentHashMap 实现的缓存。
-
Caffeine:基于 Google 的 Caffeine 实现的缓存。
-
Ehcache:基于 Ehcache 开源缓存框架实现的缓存。
-
Hazelcast:基于 Hazelcast In-Memory Data Grid 实现的缓存。
-
Redis:基于 Redis 实现的缓存。
如何使用 Cache 抽象
首先,需要添加 Spring 缓存的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
然后,在需要使用缓存的方法上添加 @Cacheable 注解:
@Cacheable(value = "userCache", key = "#id")
public User getUserById(Long id) {
// 从数据库中获取用户信息,省略...
return user;
}
上面的代码中,@Cacheable 注解用于缓存获取数据的方法。其中 value 属性表示缓存的名称,在缓存管理器中管理;key 属性表示缓存的 key,用于唯一标识缓存中的数据。
如果需要添加缓存,可以使用 @CachePut 注解:
@CachePut(value = "userCache", key = "#user.getId()")
public void saveUser(User user) {
// 将用户信息保存到数据库中,省略...
}
上面的代码中,@CachePut 注解用于更新缓存。如果缓存中不存在相应的 key,会在缓存中添加相应的缓存;如果缓存中已经存在相应的 key,则会覆盖缓存中原始的数据。
如果需要删除缓存,可以使用 @CacheEvict 注解:
@CacheEvict(value = "userCache", key = "#id")
public void deleteUser(Long id) {
// 从数据库中删除用户信息,省略...
}
上面的代码中,@CacheEvict 注解用于删除缓存。value 属性表示缓存的名称,在缓存管理器中管理;key 属性表示缓存的 key,用于唯一标识缓存中的数据。
示例一:使用 ConcurrentHashMap 实现缓存
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("userCache");
}
}
上面的代码中,我们创建了一个名为 "userCache" 的 ConcurrentHashMap 缓存。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Cacheable(value = "userCache", key = "#id")
public User getUserById(Long id) {
// 从数据库中获取用户信息,省略...
return user;
}
}
上面的代码中,我们通过 @Cacheable 注解将 getUserById 方法返回的 User 对象缓存到 "userCache" 缓存中。
示例二:使用 Redis 实现缓存
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10)))
.transactionAware()
.build();
}
}
上面的代码中,我们创建了一个名为 "userCache" 的 Redis 缓存,并且指定了缓存的过期时间为 10 分钟。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Cacheable(value = "userCache", key = "#id")
public User getUserById(Long id) {
// 从数据库中获取用户信息,省略...
return user;
}
}
上面的代码中,我们通过 @Cacheable 注解将 getUserById 方法返回的 User 对象缓存到 "userCache" 缓存中。
小结
通过使用 Spring Cache 抽象,我们可以轻松地实现基于缓存的优化。可以根据实际情况选择不同的缓存实现(如 ConcurrentHashMap、Caffeine、Ehcache、Hazelcast、Redis 等),从而适配不同的应用场景。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring框架学习之Cache抽象详解 - Python技术站