微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
多级缓存
文章目录
- 微服务框架
- 多级缓存
- 46 JVM 进程缓存
- 46.4 实现进程缓存
- 46.4.1 实现进程缓存
46 JVM 进程缓存
46.4 实现进程缓存
46.4.1 实现进程缓存
直接开干
【案例】 实现商品的查询的本地进程缓存
利用Caffeine实现下列需求:
- 给根据id查询商品的业务添加缓存,缓存未命中时查询数据库
- 给根据id查询商品库存的业务添加缓存,缓存未命中时查询数据库
- 缓存初始大小为100
- 缓存上限为10000
先来一个配置类
package com.heima.item.config;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.heima.item.pojo.Item;
import com.heima.item.pojo.ItemStock;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* ClassName: CaffeineConfig
* date: 2022/11/8 10:51
*
* @author DingJiaxiong
*/
@Configuration
public class CaffeineConfig {
@Bean
public Cache<Long, Item> itemCache() {
return Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(10_000)
.build();
}
@Bean
public Cache<Long, ItemStock> stockCache() {
return Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(10_000)
.build();
}
}
这样两个 缓存就定义好 了
修改控制器
两个查询业务接口
@Autowired
private Cache<Long, Item> itemCache;
@Autowired
private Cache<Long, ItemStock> stockCache;
@GetMapping("/{id}")
public Item findById(@PathVariable("id") Long id) {
return itemCache.get(id, key -> itemService.query()
.ne("status", 3).eq("id", key)
.one()
);
}
@GetMapping("/stock/{id}")
public ItemStock findStockById(@PathVariable("id") Long id) {
return stockCache.get(id, key -> stockService.getById(key));
}
这样就是加上缓存了
重启测试
OK,重启完成
清一下控制台日志,使用postman 访问两个接口
OK,,拿到了
看看日志
第一次嘛,有一条SQL 语句,查的10001
再来一次
OK,可以看到,效果很明显,不管再来多少次,都不会再去数据库拿了,这就实现了进程缓存
再试试查库存,先把控制台日志清空
效果也很明显,查询库存 也就实现了进程缓存