IT袋

当前位置:主页 > 经验教程 > 建站编程 >

多级缓存设计和实战应用

多级缓存设计和实战应用 多级缓存的设计与应用(2)

时间:2024-01-27 18:00:34 来源:IT袋 作者:马勇
导读:多级缓存设计和实战应用,我们简单描述下,当请求进入系统后的工作流程: 浏览器访问静态资源时,优先读取 浏览器本地缓存 访问非静态资源(ajax查询数据)时,访问服务端 请

多级缓存设计和实战应用

多级缓存设计和实战应用

我们简单描述下,当请求进入系统后的工作流程:

  1. 浏览器访问静态资源时,优先读取浏览器本地缓存
  2. 访问非静态资源(ajax查询数据)时,访问服务端
  3. 请求到达Nginx后,优先读取Nginx本地缓存
  4. 如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat)
  5. 如果Redis查询未命中,请求进入Tomcat后,优先查询JVM进程缓存
  6. 如果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使用:

  1. 导入依赖
<dependency>
  <groupId>com.github.ben-manes.caffeine</groupId>
  <artifactId>caffeine</artifactId>
</dependency>
  1. 基本用法
@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";
    });
}
  1. 真实案例编写

利用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,返回正确结果

相关阅读

  • 服务器优化的重要性 服务器优化方法

    服务器优化的重要性 服务器优化方法

    如果想了解服务器优化的重要性的IT小经验,一定能解决您的问题的,一起来了解吧! 服务器优化是指通过对服务器硬件、软件和网络进行调整和优化,以提高服务器的性能和稳定性,从而提

  • 怎么创建网络平台账号 创建网站免费注册

    怎么创建网络平台账号 创建网站免费注册

    关于这个怎么创建网络平台账号和创建网站免费注册方面的知识,具体详情如下: 在当下,传统的线下营销渠道已经无法满足消费者的多样化需求,所以很多企业商家都会选择搭建一个网站平

  • 创建一个网站要多少钱 自己做一个网站需要的费用

    创建一个网站要多少钱 自己做一个网站需要的费用

    对于大多数网友来说创建一个网站要多少钱和自己做一个网站需要的费用的方法内容,继续往下看吧! 想搞一个网站,我们先了解一下搞个网站需要多少钱?网站建设费用主要包括:网站搭建

  • OSI七层网络模型传输层详解 传输层使用的协议有哪些

    OSI七层网络模型传输层详解 传输层使用的协议有哪些

    今日重点为您介绍OSI七层网络模型传输层详解的IT知识,接下来小编为网友介绍。 传输层是OSI七层网络模型中的第四层,主要负责为应用层提供端到端的数据传输服务,同时也可以对网络层提