SpringBoot整合Redis實現自動快取、更新、刪除
阿新 • • 發佈:2018-12-15
1:引入springboot redis的maven依賴(建議使用spring-boot-dependencies或者使用spring-io-platform進行構建專案)
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
2:配置RedisConfig
/** * @author liuenyuan **/ @Configuration @EnableCaching @Slf4j public class RedisConfig extends CachingConfigurerSupport { @Autowired private RedisProperties redisProperties; /** * redis cache name **/ public static final String REDIS_CACHE_NAME = "epc"; /** * {@link org.springframework.cache.annotation.Cacheable}第一個註解代表從快取中查詢指定的key,如果有,從快取中取,不再執行方法.如果沒有則執 * 行方法,並且將方法的返回值和指定的key關聯起來,放入到快取中.<br/> * {@link org.springframework.cache.annotation.CacheEvict}從快取中清除指定的key對應的資料.<br/> * {@link org.springframework.cache.annotation.CachePut}在新增或者更新的時候,進行使用;更新時,則會覆蓋原先的資料<br/> * {@link com.adc.da.main.util.RedisService}是使用示例 * * @see org.springframework.cache.annotation.CacheEvict * @see org.springframework.cache.annotation.Cacheable * @see org.springframework.cache.annotation.CachePut * @see com.adc.da.main.util.RedisService **/ @Bean public CacheManager cacheManager(@Autowired RedisTemplate redisTemplate) { RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate); //0表示永不過期 redisCacheManager.setDefaultExpiration(0); return redisCacheManager; } /** * key redis serializer: {@link StringRedisSerializer} and * key redis serializer: {@link Jackson2JsonRedisSerializer} **/ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); Jackson2JsonRedisSerializer valueRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //設定Redis的value為json格式,並存儲物件資訊的序列化型別 ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); valueRedisSerializer.setObjectMapper(objectMapper); RedisSerializer keyRedisSerializer = new StringRedisSerializer(); template.setKeySerializer(keyRedisSerializer); template.setValueSerializer(valueRedisSerializer); template.setHashKeySerializer(keyRedisSerializer); template.setHashValueSerializer(valueRedisSerializer); template.setConnectionFactory(factory); template.afterPropertiesSet(); log.info("redis server host:{},port:{},database:{}", redisProperties.getHost(), redisProperties.getPort(), redisProperties.getDatabase()); return template; } }
3:配置application.properties的redis相關配置
#redis # Redis資料庫索引(預設為0) spring.redis.database=0 # Redis伺服器地址 spring.redis.host=106.2.13.200 # Redis伺服器連線埠 spring.redis.port=6379 # 連線池最大連線數(使用負值表示沒有限制) spring.redis.pool.max-active=16 # 連線池最大阻塞等待時間(使用負值表示沒有限制:毫秒) spring.redis.pool.max-wait=5000 # 連線池中的最大空閒連線 spring.redis.pool.max-idle=8 # 連線池中的最小空閒連線 spring.redis.pool.min-idle=0 # 連線超時時間(毫秒) spring.redis.timeout=3000
4:自動快取的使用
/** * redis use for example * * @author liuenyuan **/ @Service @CacheConfig(cacheNames = RedisConfig.REDIS_CACHE_NAME) public class RedisService { //#p0,代表第一個引數 //Cacheable如果快取沒有值,從則執行方法並快取資料,如果快取有值,則從快取中獲取值. @Cacheable(key = "#p0") public BusRefImg findOne(String id) { return new BusRefImg(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID()); } //刪除,從快取中刪除相關的key-value值 // 用來標註在需要清除快取元素的方法或類上 @CacheEvict(key = "#p0") public boolean deleteOne(String id) { return true; } //新增 //#p0代表第一個引數,其中spring的cache支援Spel表示式 @CacheEvict(key = "#p0.id") public BusRefImg saveOne(BusRefImg busRefImg) { return busRefImg; } //修改 //執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。 @CachePut(key = "#p0.id") public BusRefImg updateOne(BusRefImg busRefImg) { return busRefImg; } }