- 準備作業(在專案中一般是要寫到公共服務中)
- 匯入依賴包
<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- spring2.X集成redis所需common-pool2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.0</version> </dependency> - 在組態檔中配置Redis
# Redis配置 spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.database=0 spring.redis.timeout=1800000 spring.redis.lettuce.pool.max-active=20 spring.redis.lettuce.pool.max-wait=-1 # 最大阻塞等待時間(負數表示沒限制) spring.redis.lettuce.pool.max-idle=5 spring.redis.lettuce.pool.min-idle=0 - 創建redis快取配置類,配置插件(較為固定)
package com.xsha.servicebase; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解決查詢快取轉換例外的問題 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解決亂碼的問題),過期時間600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } } - 因為首頁介面對應獲取的首頁資料變化不大,但訪問量較大,所以就有必要將首頁介面資料快取到redis快取中,減少資料庫壓力和提高訪問速度
- Spring Boot快取注解
- 快取
@Cacheable(一般用在查詢的方法上)- 根據方法對其回傳結果進行快取,下次請求時,如果快取存在,則直接讀取快取資料;如果不存在,則執行方法,并把回傳的結果存入快取中
- 屬性及其描述
- value:快取名稱,必填,指定快取存放在哪塊命名空間
- cacheNames:與value差不多,二選一即可
- key:可選屬性,可以使用SpEL標簽自定義快取的key
- 快取
@CachePut(一般用在新增的方法上)- 使用該注解標志的方法,每次都會執行,并將結果存入指定的快取中,其他方法可以直接從回應的快取中讀取快取資料,而不需要再去查詢資料庫
- 屬性及其描述
- value:快取名稱,必填,指定快取存放在哪塊命名空間
- cacheNames:與value差不多,二選一即可
- key:可選屬性,可以使用SpEL標簽自定義快取的key
- 快取
@CacheEvict(一般用在更新或者洗掉的方法上)- 使用該注解標志的方法,會清空指定的快取
- 屬性及其描述
- value:快取名稱,必填,指定快取存放在哪塊命名空間
- cacheNames:與value差不多,二選一即可
- key:可選屬性,可以使用SpEL標簽自定義快取的key
- allEntries:是否清空所有快取,默認為false,如果指定為true,則方法呼叫后將立即清空所有的快取
- beforeInvocation:是否在方法執行前就清空,默認為false,如果指定為true,則在方法執行前就會清空快取
- 注意事項: 屬性key的值需要再價格單引號,不然會報錯,如@Cacheable(key="'keyName'", value="https://www.cnblogs.com/aitiknowledge/p/valueName")
- 快取
- 匯入依賴包
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/435476.html
標籤:Java
