什么情况用本地缓存?
查询多,但更新少的数据:比如字典数据,用户信息等等。
比较明显的场景是字典数据,之前遇到过每个查询都必须用到字典数据。
可能有人喜欢在数据库里面连表查询,这也是一种方案。
但假如我们要查询的表有几百万或者上千万数据,这时候再去连表就不划算了。更简单的方案是,把字典或者小一些的表数据查询回来,放到本地缓存里面。
在Java代码中进行整合,会发现速度很快。
这种方式有个限制,就是字典数据不能太大了。比如字典里面几万条,那用了本地缓存作用也不大。
本地缓存和Redis
我为什么不用Redis?
首先Redis每次还是会联网去取值,对于字典这一类的,有点多此一举了。
另外存在Redis中,相对来说比从数据库查询数据快,还是无法与本地缓存相提并论。
Redis虽然香,但在这个场景下,本地缓存更香一些。
选哪个本地缓存?
Caffeine!
Spring Boot官方默认本地缓存实现,Spring严选。
简单来一句,Caffeine底层其实是用ConcurrentMap封装的,只不过框架实现了丰富的缓存策略,高性能,易于使用的API,和Spring Boot结合起来使用更方便等等。
来个🌰
1. 引入依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>3.1.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2. 启用缓存
@SpringBootApplication
// 用下面的注解启用缓存.
@EnableCaching
public class ServerApplication{
// ...其余代码
}
3. 在Service中使用
@Override
@Cacheable(
value = "rrs-dict",
key = "#rrOrder.areaCode+'-'+#rrOrder.userId",
unless = "#result==null")
public OrderDict queryOrderDict(RrOrder rrOrder) {
// ... 其它代码
}
除了@Cacheable之外,@CachePut可以更新缓存中的数据,@CacheEvict可以清除缓存中的数据。
更新缓存中的数据:
@CachePut(value = "rrs-dict", "#rrOrder.areaCode+'-'+#rrOrder.userId")
public OrderDict updateDict(RrOrder rrOrder) {
// ... 其它代码
}
清除缓存中的数据:
@CacheEvict(value = "rrs-dict", "#rrOrder.areaCode+'-'+#rrOrder.userId")
public OrderDict updateDict(RrOrder rrOrder) {
// ... 其它代码
}
清除所有:
@CacheEvict(value = "rrs-dict", allEntries = true)
public void clearDict() {
// ... 其它代码
}
你学会了吗?