-
Notifications
You must be signed in to change notification settings - Fork 626
使用Spring缓存机制整合Redis
sqmax edited this page Jan 1, 2019
·
3 revisions
被缓存的类必须是序列化的,实现Serializable接口,这样就可以通过Spring的序列化器,将其保存为对应的编码,缓存到Redis中,也可以通过Redis读回那些编码,反序列化为对应的Java对象。
在Spring项目中它提供了接口CacheManager来定义缓存管理器,这样各个不同的缓存即可以实现它来提供管理器的功能了,而在spring-data-redis.jar包中实现CacheManager接口的则是RedisCacheManager,因此要定义RedisCacheManager的Bean,不过在此之前要先定义RedisTemplate。下面使用注解驱动RedisCacheManager定义。
@Configuration
@EnableCaching
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate initRedisTemplate() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
// 最大空闲数
poolConfig.setMaxIdle(50);
// 最大连接数
poolConfig.setMaxTotal(100);
// 最大等待毫秒数
poolConfig.setMaxWaitMillis(20000);
// 创建Jedis连接工厂
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(poolConfig);
connectionFactory.setHostName("localhost");
connectionFactory.setPort(6379);
// 调用后初始化方法,没有它将抛出异常
connectionFactory.afterPropertiesSet();
// 自定Redis序列化器
RedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
RedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 定义RedisTemplate,并设置连接工程
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(connectionFactory);
// 设置序列化器
redisTemplate.setDefaultSerializer(stringRedisSerializer);
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
return redisTemplate;
}
@Bean(name = "redisCacheManager")
public CacheManager initRedisCacheManager(@Autowired RedisTemplate redisTempate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTempate);
// 设置超时时间为10分钟,单位为秒
cacheManager.setDefaultExpiration(600);
// 设置缓存名称
List<String> cacheNames = new ArrayList<String>();
cacheNames.add("redisCacheManager");
cacheManager.setCacheNames(cacheNames);
return cacheManager;
}
}
配置好上面的缓存管理器bean后,Spring就允许使用注解的方式使用缓存了,常用的注解有如下3个: @Cacheable、@CachePut、@CacheEvict
- @Cacheable:当缓存中有值,则返回缓存数据,否则访问方法得到数据。
- @CachePut:表示无论如何都会执行方法,最后将方法的返回值在保存到缓存中,更新数据库数据的同时,也会同步更新缓存。
- @CacheEvict:主要是为了移除缓存中对应的键值对,主要对于那些删除的操作,在方法执行完成后移除对应的缓存。
在我们的Spring Boot项目中上面的RedisCacheManager bean并没有显式地配置,只是在配置文件application.yml有如下的配置:
spring:
redis:
host: 127.0.0.1
port: 6379
当我们引入如下依赖时,Spring Boot就会自动配置相关的bean:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
目录