多级缓存设计和实战应用 多层次缓存设计和实际应用(2)
多级缓存设计和实战应用

我们简单描述下,当请求进入系统后的工作流程:
- 浏览器访问静态资源时,优先读取
浏览器本地缓存 - 访问非静态资源(ajax查询数据)时,访问服务端
- 请求到达Nginx后,优先读取
Nginx本地缓存 - 如果Nginx本地缓存未命中,则去直接查询
Redis(不经过Tomcat) - 如果Redis查询未命中,请求进入Tomcat后,优先查询
JVM进程缓存 - 如果JVM进程缓存未命中,则查询数据库
标注:
在多级缓存架构中,基于OpenResty框架Nginx内部需要编写本地缓存查询、Redis查询、Tomcat查询的业务逻辑,因此这样的nginx服务不再是一个反向代理服务器,而是一个编写业务的Web服务器。因此这样的业务Nginx服务也需要搭建集群来提高并发,再有专门的nginx服务来做反向代理
小结
可见,全链路多级缓存有几个关键点:
- 浏览器本地缓存
- nginx本地缓存(运用OpenResty中Nginx+Lua编程)
- Redis缓存
- JVM进程本地缓存
本文重点聊聊JVM进程缓存和Redis缓存应用
缓存对系统性能影响至关重要,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。
我们把缓存分为两类:
- 分布式缓存,例如Redis:
- 优点:存储容量更大、可靠性更好、可以在集群间共享
- 缺点:访问缓存有网络开销
- 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享
- 进程本地缓存,例如ConcurrentHashMap、Guava Cache:
- 优点:读取本地内存,没有网络开销,速度更快
- 缺点:存储容量有限、可靠性较低、无法共享
- 场景:性能要求较高,缓存数据量较小
今天我们利用Caffeine框架来实现JVM进程缓存。
JVM进程缓存(本地缓存)
JVM进程缓存 Caffeine 介绍
Caffeine 是一个基于Java8开发的,提供了近乎最佳命中率的高性能本地缓存库。
目前Spring内部的缓存使用的就是Caffeine。
官方介绍

性能测试报告对比(官方测试数据,当然不同机器结果也不同):

简单学习Caffeine使用:
- 导入依赖
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
- 基本用法
@Test
void testBasicOps() {
// 创建缓存对象
Cache<String, String> cache =
Caffeine.newBuilder()
.expireAfterWrite(Duration.ofSeconds(10)) // 设置缓存有效期为 10 秒,从最后一次写入开始计时
.build();
// 存数据
cache.put("code", "码易有道");
// 取数据,不存在则返回null
String val = cache.getIfPresent("code_01"); //null
// 取数据,不存在则去数据库查询
String dbVal = cache.get("ping", key -> {
// 这里可以查询数据库根据 key查询value
return "pong";
});
}
- 真实案例编写
利用Caffeine实现下列需求:
- 给根据id查询商品的业务添加缓存,缓存未命中时查询数据库
- 缓存初始大小为100
- 缓存上限为10000
配置config
@Configuration
public class CaffeineConfig {
@Bean
public Cache<Long, Item> itemCache(){
return Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(10_000)
.build();
}
}
业务逻辑:
@GetMapping("/{id}")
public Item findById(@PathVariable("id") Long id) {
//查本地缓存 --> 如果没有,查数据库: 状态不为:2 ,且查询条件是ID等于指定的键值,返回一个结果
return itemCache.get(id, key -> itemService.query()
.ne("status", 2)
.eq("id", key)
.one()
);
}
演示结果:
访问:http://localhost:8081/item/10002,返回正确结果
相关阅读
-
编写一个简单的网页结构 网页设计作业html成品
小编为网友们解答编写一个简单的网页结构和网页设计作业html成品方面的介绍,具体详情如下: HTML(HyperText Markup Language)是一种简单、通用的超文本标记语言,Web服务器返回给客户端的最常
-
access数据库的对象是什么 了解access数据库的结构层次
下面为网友们详细介绍access数据库的对象是什么和了解access数据库的结构层次方面的内容,接下来分享详细内容。 说到数据处理,大家首先想到的是Excel,其实,Office中的数据处理软件除了E
-
web服务器怎么配置 免费个人web服务器推荐
对于许多网友来说web服务器怎么配置和免费个人web服务器推荐方面的内容,具体详情如下: 回想一下一个http请求的过程,你在浏览器输入xxx.com,经过域名解析 发起tcp的3次握手 建立tcp连接后
-
信息加密、解密与常用算法的基本概念和相关知识
本文为您带来的是信息加密、解密与常用算法的基本概念和相关知识的话题,请看下面详细的介绍。 一、信息加密概念 信息加密技术是对信息进行伪装,使得信息非法窃取者无法理解信息的真


