Skip to content

使用Spring缓存机制整合Redis

sqmax edited this page Jan 1, 2019 · 3 revisions

使用Spring缓存机制整合Redis

被缓存的类必须是序列化的,实现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>