- Notifications
You must be signed in to change notification settings - Fork 628
使用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>
目录