亿级流量的缓存方案-多级缓存-JVM进程缓存-Caffeine

目录

  • 传统缓存的问题
  • 多级缓存方案
  • 缓存方案对比
  • JVM进程缓存-Caffeine
    • Caffeine示例
    • Caffeine提供了三种缓存驱逐策略:
    • 架构
    • 导入Sql
    • 导入Demo工程
    • 导入商品查询页面
    • 配置反向代理
    • 访问商品详情页面
  • 本地进程缓存

https://blog.csdn.net/sichenss/article/details/124520356

传统缓存的问题

传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题:

  • 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈
  • Redis缓存失效时,会对数据库产生冲击

亿级流量的缓存方案-多级缓存-JVM进程缓存-Caffeine_第1张图片

多级缓存方案

多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能:
亿级流量的缓存方案-多级缓存-JVM进程缓存-Caffeine_第2张图片

缓存方案对比

缓存在日常开发中起到至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量检查对数据库的访问,减少数据库的压力,我们把缓存分为两类:

  • 分布式缓存,例如Redis:

    • 优点:存储容量更大,可靠性更好,可以在集群间共享
    • 缺点:访问缓存有网络开销
    • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享
  • 进程本地缓存,例如HashMap、GuavaCache:

    • 优点:读取本地内存,没有网络开销,速度更快
    • 缺点:存储容量有限,可靠性交底,无法共享
    • 场景:性能要求较高,缓存数据量较小

JVM进程缓存-Caffeine

Caffeine是一个基于java8开发的,提供了近乎最佳命中率的高性能本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine

官方文档:https://github.com/ben-manes/caffeine/wiki/Home-zh-CN

Caffeine示例

可以通过item-service项目中的单元测试来学习Caffeine的使用:

Caffeine提供了三种缓存驱逐策略:

  • 基于容量:设置缓存的数量上限
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()
    .maximumSize(1) // 设置缓存大小上限为 1
    .build();
  • 基于时间:设置缓存的有效时间
// 创建缓存对象
Cache<String, String> cache = Caffeine.newBuilder()
    // 设置缓存有效期为 10 秒,从最后一次写入开始计时 
    .expireAfterWrite(Duration.ofSeconds(10)) 
    .build();
  • 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。

注意:在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。

架构

通过nginx反向代理商品详情页面,然后调用后端接口返回商品详细信息并展示。

导入Sql

亿级流量的缓存方案-多级缓存-JVM进程缓存-Caffeine_第3张图片

导入Demo工程

导入商品查询页面

我们准备一个item.html页面(类似京东的商品展示页面)来展示商品信息,
并用nginx做代理
亿级流量的缓存方案-多级缓存-JVM进程缓存-Caffeine_第4张图片
在nginx的html中商品页面亿级流量的缓存方案-多级缓存-JVM进程缓存-Caffeine_第5张图片

配置反向代理

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;

    upstream nginx-cluster{
        server 192.168.150.101:8081;
    }
    server {
        listen       80;
        server_name  localhost;

	location /api {
            proxy_pass http://nginx-cluster;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

访问商品详情页面

亿级流量的缓存方案-多级缓存-JVM进程缓存-Caffeine_第6张图片

本地进程缓存

你可能感兴趣的:(缓存,redis,java)