| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
添加 @EnableCaching
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
緩存返回結果
@Cacheable("cacheable")
@RequestMapping("/test/cacheable")
@ResponseBody
public String cacheable() {
Date date = new Date();
String message = date.toString();
return message;
}
5秒鐘清楚一次緩存
@Scheduled(fixedDelay = 5000)
@CacheEvict(allEntries = true, value = "cacheable")
public void expire() {
Date date = new Date();
String message = date.toString();
System.out.println(message);
}
@Cacheable(value="users", key="#id")
public User find(Integer id) {
return null;
}
引用對象
@Cacheable(value="users", key="#user.id")
public User find(User user) {
returnnull;
}
條件判斷
@Cacheable(value="messagecache", key="#id", condition="id < 10")
public String getMessage(int id){
return "hello"+id;
}
@Cacheable(value="test",condition="#userName.length()>2")
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
#p0 參數索引,p0表示第一個參數
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
return null;
}
@Cacheable(value="users", key="#p0.id")
public User find(User user) {
return null;
}
@Cacheable 如果沒有任何參數將會自動生成 key ,前提是必須設置 @CacheConfig(cacheNames = "test")
@GetMapping("/cache/auto")
@Cacheable()
public Attribute auto() {
Attribute attribute = new Attribute();
attribute.setName("sdfsdf");
return attribute;
}
127.0.0.1:6379> keys * 1) "test::SimpleKey []"
@CachePut 每次都會執行方法,都會將結果存入指定key的緩存中,@CachePut 不會判斷是否 key 已經存在,二是始終覆蓋。
@CachePut("users")
public User find(Integer id) {
return null;
}
Springboot 1.x
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
cacheManager.setDefaultExpiration(60); //緩存預設 60 秒
Map<String, Long> expiresMap = new HashMap<>();
expiresMap.put("Product", 5L); //設置 key = Product 時 5秒緩存。你可以添加很多規則。
cacheManager.setExpires(expiresMap);
return cacheManager;
}
Springboot 2.x
package api.config;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import org.springframework.cache.CacheManager;
import org.springframework.cache.interceptor.KeyGenerator;
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.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
public class CachingConfigurer {
public CachingConfigurer() {
// TODO Auto-generated constructor stub
}
@Bean
public KeyGenerator simpleKeyGenerator() {
return (o, method, objects) -> {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(o.getClass().getSimpleName());
stringBuilder.append(".");
stringBuilder.append(method.getName());
stringBuilder.append("[");
for (Object obj : objects) {
stringBuilder.append(obj.toString());
}
stringBuilder.append("]");
return stringBuilder.toString();
};
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
return new RedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
this.redisCacheConfiguration(600), // 預設配置
this.initialCacheConfigurations()); // 指定key過期時間配置
}
private Map<String, RedisCacheConfiguration> initialCacheConfigurations() {
Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>();
redisCacheConfigurationMap.put("UserInfoList", this.redisCacheConfiguration(3000));
redisCacheConfigurationMap.put("UserInfoListAnother", this.redisCacheConfiguration(18000));
return redisCacheConfigurationMap;
}
private RedisCacheConfiguration redisCacheConfiguration(Integer seconds) {
Jackson2JsonRedisSerializer<Object> 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);
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).entryTtl(Duration.ofSeconds(seconds));
return redisCacheConfiguration;
}
}
@Cacheable(value = "DefaultKey", keyGenerator = "simpleKeyGenerator") // 600秒,使用預設策略
@Cacheable(value = "UserInfoList", keyGenerator = "simpleKeyGenerator") // 3000秒
@Cacheable(value = "UserInfoListAnother", keyGenerator = "simpleKeyGenerator") // 18000秒
127.0.0.1:6379> keys * 1) "test2::SimpleKey []" 127.0.0.1:6379> ttl "test2::SimpleKey []" (integer) 584