Caffeine

Caffeine 是java中的高性能本地缓存,提供了丰富的缓存功能。Caffeine 的目标是提供一个高吞吐量、低延迟、并发友好的缓存实现。

特点

  • 高性能:Caffeine 是基于内存的本地缓存,访问速度非常快,并且在高并发环境下表现优秀。
  • 低延迟:由于数据直接存储在应用程序的本地内存中,访问延迟几乎为零。
  • 近乎零GC开销:设计上非常高效,垃圾回收(GC)开销非常小。
  • 配置灵活:支持多种缓存失效策略,如基于时间的过期、基于容量的过期等。
  • 易用性:简单易用的API,非常适合在Java应用程序中快速集成。

缓存策略配置

Caffeine 提供了多种缓存策略和配置选项,可以灵活地满足各种需求:

  • 缓存过期策略:写入后过期expireAfterWrite、访问后过期expireAfterAccess
  • 容量配置
  • 自定义缓存加载:同步加载、异步加载
  • 统计信息:监控缓存的使用情况和性能指标 

使用

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.0.4</version> <!-- 请根据实际需要选择版本 -->
</dependency>
    private static Cache<String, String> localCache = Caffeine.newBuilder()
            .initialCapacity(5000)
            .maximumSize(100000)
            .expireAfterWrite(60, TimeUnit.SECONDS)
            .softValues()
            .build();

Caffeine和Redis对比

 

Redis

Caffeine

概述

  • 类型: 分布式缓存NoSQL数据库

  • 语言: 多语言支持,主要基于 C 语言

  • 特点: 高可用、持久化、丰富的数据结构、多种部署模式

  • 类型: 本地缓存库

  • 语言: Java

  • 特点: 高性能、低延迟、内存缓存

优点

  1. 分布式支持:可以作为分布式缓存,支持多个应用实例共享缓存数据。

  2. 多种数据结构:支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog 等多种数据结构。

  3. 持久化:支持数据持久化到磁盘,防止数据丢失。

  4. 高可用:支持主从复制、哨兵模式和集群模式,提供高可用性和规模化扩展能力。

  5. 丰富功能:如发布/订阅、Lua 脚本、事务等。

  1. 高性能:Caffeine 是基于内存的本地缓存,访问速度非常快,并且在高并发环境下表现优秀。

  2. 低延迟:由于数据直接存储在应用程序的本地内存中,访问延迟几乎为零。

  3. 近乎零GC开销:设计上非常高效,垃圾回收(GC)开销非常小。

  4. 配置灵活:支持多种缓存失效策略,如基于时间的过期、基于容量的过期等。

  5. 易用性:简单易用的API,非常适合在Java应用程序中快速集成。

缺点

  1. 网络开销:由于Redis在分布式环境中使用,访问需要通过网络,不如本地缓存那么低延迟。

  2. 配置和运维复杂:需要安装和维护Redis服务器,相对于本地缓存库,运维复杂度高。

  3. 内存开销:高频访问大数据量时,内存占用较大,需要合理配置和管理。

  1. 局限于单个应用节点:只能在单个应用实例中使用,无法在多个应用实例之间共享缓存数据。

  2. 内存有限制:缓存数据受限于应用服务器的内存大小,适合不需要大规模数据缓存的应用场景。

  3. 无持久化支持:数据仅存储在内存中,应用重启或崩溃时,缓存数据丢失。

使用场景

  • 分布式系统,需要多个应用实例共享缓存数据

  • 大规模缓存需求,单台服务器内存无法满足。

  • 需要数据高可用、持久化、跨节点共享。

  • 需要复杂数据结构和功能支持,如发布/订阅、计数等。

  • 单节点应用,需要快速访问本地缓存

  • 高并发、高性能要求的应用。

  • 小规模缓存需求,不需要跨节点共享数据。

  • 缓存数据在应用生命周期内有效,无需持久化。

 

二级缓存:

一般将两者Caffeine和Redis结合起来,形成一二级缓存。使用流程大致如下:

  • 1.一级缓存:先去本地缓存caffeine中查找数据(本地)
  • 2.二级缓存:如果没有的话,去redis中查找数据(远程)
  • 3.数据库:都没有,再去数据库中查找数据(磁盘)

 

posted @   zhegeMaw  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示