多级缓存实现方案

多级缓存

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

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

Caffeine

进程本地缓存,例如HashMap、GuavaCache、Caffeine:

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

Caffeine 是一个超强大的高性能本地缓存框架,除了基本的缓存功能之外,Caffeine 还提供了过期、异步加载、事件通知等功能。

基本API
@Test
void testBasicOps() {
    // 构建cache对象
    Cache<String, String> cache = Caffeine.newBuilder().build();

    // 存数据
    cache.put("gf", "迪丽热巴");

    // 取数据
    String gf = cache.getIfPresent("gf");
    System.out.println("gf = " + gf);

    // 取数据,包含两个参数:
    // 参数一:缓存的key
    // 参数二:Lambda表达式,表达式参数就是缓存的key,方法体是查询数据库的逻辑
    // 优先根据key查询JVM缓存,如果未命中,则执行参数二的Lambda表达式
    String defaultGF = cache.get("defaultGF", key -> {
        // 根据key去数据库查询数据
        return "柳岩";
    });
    System.out.println("defaultGF = " + defaultGF);
}
缓存驱逐策略

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不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。

相关推荐

  1. 多级缓存实现方案

    2024-04-22 19:12:06       13 阅读
  2. 使用SpringAOP+Caffeine+Redis实现本地缓存多级缓存

    2024-04-22 19:12:06       17 阅读
  3. Redis-Redis多级缓存架构(实践

    2024-04-22 19:12:06       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 19:12:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 19:12:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 19:12:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 19:12:06       20 阅读

热门阅读

  1. Pytorch实用教程:nn.LSTM内部是如何实现的

    2024-04-22 19:12:06       19 阅读
  2. windows@允许挂载http链接@挂载局域网http链接

    2024-04-22 19:12:06       12 阅读
  3. 如何利用R语言获取worldclim30s的气候数据

    2024-04-22 19:12:06       14 阅读
  4. 开发语言漫谈-kotlin

    2024-04-22 19:12:06       13 阅读
  5. Scala详解(4)

    2024-04-22 19:12:06       14 阅读
  6. Scala 第二篇 算子篇

    2024-04-22 19:12:06       14 阅读
  7. Scala 复习笔记

    2024-04-22 19:12:06       12 阅读
  8. 跨境电商爬数据

    2024-04-22 19:12:06       10 阅读
  9. Scala详解(6)

    2024-04-22 19:12:06       13 阅读
  10. Rust常用特型之Sized特型

    2024-04-22 19:12:06       14 阅读