之前是在linux中实现了redis缓存的高可用集群搭建。
但是实际生产中有一个问题,那就是你每次查询redis缓存的时候,都是需要经由tomcat进行查询,那么你整个项目的性能聚会局限于tomcat的性能。
解决办法也简单,需要我们来实现多级缓存方案:
今天先来实现jvm的进程缓存。我是在intellij中进行的jvm进程缓存的演示操作!
项目搭建
先创建一个maven项目,然后写1个接口。这就是一个普通的数据查询接口。
@GetMapping("/stock/{id}")
public ItemStock findStockById(@PathVariable("id") Long id){
return stockService.getById(id);
}
项目测试
页面请求后后台的日志打印:
[nio-8081-exec-3] c.h.item.mapper.ItemMapper.selectOne : ==> Parameters: 3(Integer), 10001(Long)
[nio-8081-exec-3] c.h.item.mapper.ItemMapper.selectOne : <== Total: 1
[nio-8081-exec-9] c.h.i.mapper.ItemStockMapper.selectById : ==> Preparing: SELECT item_id AS id,stock,sold FROM tb_item_stock WHERE item_id=?
[nio-8081-exec-9] c.h.i.mapper.ItemStockMapper.selectById : ==> Parameters: 10001(Long)
[nio-8081-exec-9] c.h.i.mapper.ItemStockMapper.selectById : <== Total: 1
正常情况下我们请求这个接口的时候,肯定会查询数据库的。那么为了减轻数据库的压力,今天就来实现jvm的进程缓存。
caffeine使用
pom中先导入caffeine依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
编写caffeine的配置类
@Configuration
public class CaffeineConfig {
@Bean
public Cache<Long , ItemStock> itemStockCache(){
return Caffeine.newBuilder()
.initialCapacity(100) // 初始化大小
.maximumSize(10_000) //最大值
.build();
}
}
再修改controller中的代码
@GetMapping("/stock/{id}")
public ItemStock findStockById(@PathVariable("id") Long id){
// 这里使用lamda实现的,如果这个id存在于jvm缓存中,就从缓存中获取,否则就走数据库的查询方法
return itemStockCache.get(id,key->stockService.getById(key));
}
重起项目之后再次进行接口请求,发现第一次请求发起的时候,还是走了数据库请求,这是因为当前缓存中还没有数据,不过这个时候会同步在缓存中存储下来。接下来的n次请求就会发现控制台中并没有输出链接数据库的信息。
到此!jvm的进程缓存就实现了。
下一篇将继续实现nginx的本地缓存。不过这门技术是需要进行脚本编写的,而这个脚本语言就是lua,是基于c语言实现的。跟python很像。
写作不易,如果对您有所帮助,请给个关注吧!谢谢!