应对各种性能问题支持高并发的一大利器:缓存
1.@Cacheable注解
在 SpringBoot 的启动类上添加注解@EnableCaching
。
@Cacheable
的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存。
参数说明:
cacheNames:
用来指定缓存组件名称。
@Cacheable(cacheNames = "users", key="#id")
public User getUser(Integer id) {}
key
:缓存数据的 key,可以用它来指定。默认使用所有参数的值进行组合。(key可以使用 spEL 表达式来编写)。
@Cacheable(cacheNames = "usersBySpEL", key="#root.methodName + '[' + #id + ']'")
public User getUserBySpEL(Integer id) {}
keyGenerator
:key 的生成器。key 和 keyGenerator 二选一使用。
@Cacheable(cacheNames = "userByKeyGenerator", keyGenerator = "myKeyGenerator") public User getUserByKeyGenerator(Integer id) {}
condition
:指定符合条件的情况下才缓存。
@Cacheable(cacheNames = "userByCondition", condition = "#id > 1") public User getUserByCondition(Integer id) {}
unless
:指定不符合条件的情况下才缓存。(可以获取到结果进行判断,通过 #result 获取方法结果,unless,汉语意思,除非,指会缓存,除了。。。之外
)。
@Cacheable(cacheNames = "userByUnless", unless = "#id > 1") public User getUserByUnless(Integer id) {}
sync
:是否使用异步模式。
2.其他的缓存注解
@CachePut
的作用 主要针对配置,能够根据方法的请求参数对其结果进行缓存。
1.区别于 @Cacheable
,它每次都会触发真实方法的调用
,可以保证缓存的一致性。
2.属性与 @Cacheable
类同。
@CachePut(cacheNames = "users" , key = "#user.id")
public User addUser(User user) {}
@CacheEvict
的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空
。
cacheNames:用来指定缓存组件名称。
key:缓存数据的 key,可以用它来指定。默认使用所有参数的值进行组合。(key可以使用 spEL 表达式来编写)。
condition:指定符合条件的情况下的缓存。
allEntries:是否清空所有缓存,缺省为false。
beforeInvocation:是否在方法执行前就清空,缺省为false,缺省情况下,如果方法执行抛异常,则不会清空缓存。
@CacheEvict(cacheNames = "users", key = "#id")
public void delUserCache(Integer id) {}
@CacheConfig
的作用 主要针对类配置,能够设置当前类中 @Cacheable 的 value 属性默认值
。当然如果 @Cacheable
设置了 value,还是以设置的值为准。
cacheNames
: 指定缓存名称默认值。
@Caching
的作用 主要针对方法配置,能够组合多个Cache注解
。比如用户新增成功后,我们可能需要添加 id -> user、username -> user、email -> user 的缓存,此时就需要 @Caching
组合多个注解标签了。
cacheable:组合多个 @Cacheable 注解
put:组合多个 @CachePut 注解
evict:组合多个 @CacheEvict 注解
@CacheConfig(cacheNames = "users")
public class CacheTestServiceImpl implements CacheTestService {
/**
* @Cacheable 的 cacheNames 默认为 "users"
*/
@Cacheable(key="#id")
public User getUser(Integer id) {...}
}
缓存有:堆缓存(Ehcache3.x、Guava Cache、Caffeine等)、堆外缓存(Ehcache3.x、MapDB等)、分布式缓存(Redis、Memcached等)等等。
常用的缓存注解:@EnableCaching、@Cacheable、@CachePut、@CacheEvict、