Spring @Cacheable 注解
所属分类 spring
浏览量 40
SpringBoot默认提供多种缓存管理器实现
ConcurrentMapCacheManager EhCacheCacheManager RedisCacheManager 等
org.springframework.cache.CacheManager
public interface CacheManager {
@Nullable
Cache getCache(String name);
Collection getCacheNames();
}
org.springframework.cache.Cache
public interface Cache {
String getName();
// Return the underlying native cache provider.
Object getNativeCache();
ValueWrapper get(Object key);
< T > T get(Object key, @Nullable Class< T > type);
< T > T get(Object key, Callable< T > valueLoader);
void put(Object key, @Nullable Object value);
default ValueWrapper putIfAbsent(Object key, @Nullable Object value)
void evict(Object key);
void clear();
}
@Cacheable 的 value 和 key
value:指定缓存的名称或分组,必须指定。
key:指定缓存数据的键,可以使用 SpEL 表达式动态生成,如果不指定,则默认使用方法的所有参数组合生成键。
value 参数用于指定缓存的名称或分组。它表示方法的结果将被缓存到哪个缓存中。
在Spring4及更高版本中,value 和 cacheNames 是等价的,可以互换使用。
value 属性是必须指定的,除非在类级别使用了 @CacheConfig 注解来指定默认的缓存名称。
key 参数用于指定缓存数据的键。
如果未指定 key,Spring 默认使用方法的所有参数组合生成一个键。
key 参数支持使用 SpEL(Spring Expression Language)表达式来动态生成键。
@Cacheable(value = "users")
public User find(Integer id) {
return null;
}
@Cacheable(value = {"cache1", "cache2"})
public User find(Integer id) {
return null;
}
@Cacheable(value = "users", key = "#id")
public User find(Integer id) {
return null;
}
@Cacheable(value = "users", key = "#user.id")
public User find(User user) {
return null;
}
@Cacheable(value = "searchResults", key = "#query + '_' + #page + '_' + #count + '_' + #sortDirection")
public List< SearchResult > search(String query, int page, int count, String sortDirection) {
return performSearch(query, page, count, sortDirection);
}
spring 本地缓存 和 redis 切换
spring-boot-starter-cache
spring-boot-starter-data-redis
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
spring.redis.timeout=30000
@EnableCaching
@Cacheable、@CachePut、@CacheEvict
切换到本地缓存
spring.cache.type=simple
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
System.out.println("从数据库查询用户信息");
return userRepository.findById(id).orElse(null);
}
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
System.out.println("更新用户信息");
return userRepository.save(user);
}
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
System.out.println("删除用户信息");
userRepository.deleteById(id);
}
@CacheEvict(value = "users", allEntries = true)
public void clearAllUsersCache() {
System.out.println("清除所有用户缓存");
}
}
@CacheConfig 在类级别共享缓存配置,如缓存名称、键生成器等。
@Caching注解用于组合多个缓存操作,如同时更新和清除缓存。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Caching(
put = @CachePut(value = "users", key = "#user.id "),
evict = @CacheEvict(value = "users", allEntries = true)
)
public User updateUserAndClearCache(User user) {
System.out.println("更新用户信息并清除所有用户缓存");
return userRepository.save(user);
}
}
上一篇
下一篇
springboot Selenium Chrome ChromeDriver 实现网页截屏
Quartz 2.3.2 使用
裸K price action 概述
《底层逻辑》笔记
《底层逻辑》笔记2
推荐书单