SpringBoot缓存Ehcache的使用详解
Spring Boot提供了对缓存的支持,可以方便地使用缓存来提高应用程序的性能。本攻略将详细讲解Spring Boot缓存Ehcache的使用方法,包括缓存的创建、取、更新和删除,以及缓存的失效策略和缓存的持久化等方面,并提供两个示例说明。
创建缓存
要创建一个缓存,我们需要在Spring Boot应用程序中添加缓存依赖,例如EhCache、Redis等。以EhCache为例,我们需要在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
然后,在Spring Boot应用程序中,我们可以使用@Cacheable注解来创建一个缓存:
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Cacheable(value = "userCache", key = "#id")
public User getUserById(String id) {
return userDao.getUserById(id);
}
@CachePut(value = "userCache", key = "#user.id")
public void updateUser(User user) {
userDao.updateUser(user);
}
@CacheEvict(value = "userCache", key = "#id")
public void deleteUser(String id) {
userDao.deleteUser(id);
}
}
在这个示例中,我们使用@Cacheable注解创建了一个名为“userCache”的缓存,缓存的key为用户的id。在读取数据时,如果缓存中存在数据,则直接从缓存中读取数据,否则从数据库中读取数据,并将数据存储到缓存中。在更新数据时,我们使用@CachePut注解更新缓存中的数据。在删除数据时,我们使用@CacheEvict注解从缓存中删除相应的数据。
缓存失效策略
Spring Boot提供了多种缓失效策略,包括基于时间的失效策略、基于访问的失效策略和基于元素的失效策略。我们可以通过以下方式设置缓存的失效策略:
@Cacheable(value = "userCache", key = "#id",
cacheManager = "cacheManager",
condition = "#id.length() < 10",
unless = "#result == null")
public User getUserById(String id) {
return userDao.getUserById(id);
}
在这个示例中,我们使用@Cacheable注解设置了缓存的失效策略。我们使用cacheManager属性指定了缓存管理器,使用condition属性指定了缓存的条件,只有当id的长度小于10时才会缓存数据,使用unless属性指定了缓存的排除条件,只有当返回结果不为时才会缓存数据。
缓存持久化
Spring Boot提供了多种缓存持久化方式,包括内存持久化、磁盘持久化和缓存复制。我们可以通过以下方式设置缓存的持久化方式:
@Bean
public CacheManager cacheManager() {
EhCacheCacheManager cacheManager = new EhCacheCacheManager();
cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject());
return cacheManager;
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
ehCacheManagerFactoryBean.setShared(true);
return ehCacheManagerFactoryBean;
}
在这个示例中,我们使用EhCache作为缓存管理器,并将缓存配置文件ehcache.xml放在classpath下。这样,即使应用程序关闭,缓存中的数据也会被保存到磁盘中,次启动应用程序时,缓存中数据会自动加载。
示例说明
示例一:使用EhCache实缓存
public class UserService {
@Autowired
private UserDao userDao;
@Cacheable(value = "userCache", key = "#id")
public User getUserById(String id) {
return userDao.getUserById(id);
}
@CachePut(value = "userCache", key = "#user.id")
public void updateUser(User user) {
userDao.updateUser(user);
}
@CacheEvict(value = "userCache", key = "#id")
public void deleteUser(String id) {
userDao.deleteUser(id);
}
}
在这个示例中,我们使用EhCache实现了一个缓存,缓存的名称为“userCache”,缓存的key为用户的id。在读取数据时,如果缓存中存在数据,则直接缓存中读取数据,否则从数据库中读取数据,并将数据储到缓存中。在更新数据时,我们使用@CachePut注解缓存中的数据。在删除数据时,我们使用@CacheEvict注解从缓存中删除相应的数据。
示例二:使用Redis实现缓存
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(5))
.disableCachingNullValues()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(redisCacheConfiguration)
.transactionAware()
.build();
}
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Cacheable(value = "userCache", key = "#id")
public User getUserById(String id) {
return userDao.getUserById(id);
}
@CachePut(value = "userCache", key = "#user.id")
public void updateUser(User user) {
userDao.updateUser(user);
}
@CacheEvict(value = "userCache", key = "#id")
public void deleteUser(String id) {
userDao.deleteUser(id);
}
}
在这个示例中,我们使用Redis作为缓存管理器,并将缓存配置文件放在RedisConfig类中。在UserService类中,我们使用@Cacheable注解创建了一个名为“userCache”的缓存,缓存的key为用户id。在读取数据时,如果缓存中存在数据,则直接从缓存中读取数据,否则从数据库中读取数据,并将数据存储到缓存中。在更新数据时,我们使用@CachePut注解更新缓存中的数据。在删除数据时,我们使用@CacheEvict注解从缓存中删除相应的数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot缓存Ehcache的使用详解 - Python技术站