高性能缓存方案 —— Caffeine

一、简介

Caffeine是一个高性能的Java缓存库,它提供了本地缓存的功能。

Caffeine和Redis都是内存级别的缓存,为什么要使用在这两缓存作为二级缓存,它们两有什么区别呢?

虽然它们都是内存级别的缓存,但是Redis是需要单独部署的,其需要一个单独的进程,在tomcat访问Redis时需要网络通信的开销,而Caffeine跟我们项目代码是写在一起的,它是JVM级别的缓存,用的就是Java中的堆内存,无需网络的通信的开销,在Caffeine找不到数据后才会去redis中查找。

以下是一个使用Caffeine作为本地缓存的简单示例:

复制代码
// JVM Processes Cache, Import Caffeine dependency.
<dependency>
	<groupId>com.github.ben-manes.caffeine</groupId>
	<artifactId>caffeine</artifactId>
</dependency>

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.stats.CacheStats;

import java.util.concurrent.TimeUnit;

public class CaffeineDemo {
    public static void main(String[] args) {
        // Create a local cache with a maximum size of 100
        Cache<String, String> cache = Caffeine.newBuilder()
                .maximumSize(100)
                .expireAfterWrite(5, TimeUnit.MINUTES)
                .build();

        // Put the data in the cache
        cache.put("key", "val");

        // Get data from the cache by the key, if no data, return null.
        String value = cache.getIfPresent("key");
        System.out.println(value);
        String value2 = cache.getIfPresent("key2");
        System.out.println(value2);

        // Get caching statistics
        CacheStats stats = cache.stats();
        System.out.println("Cache hits: " + stats.hitCount());
        System.out.println("Cache misses: " + stats.missCount());

        // Delete element from the cache
        cache.invalidate(("key"));
        System.out.println(cache.getIfPresent(("key")));
    }
}

运行结果:

二、驱逐策略

使用Caffeine为了防止内存溢出,提供了以下几种驱逐策略。

为了防止一直往内存里装数值导致占用内存,所以Caffeine给我们提供了驱逐策略。

1、基于容量(设置缓存的上限)

复制代码
   @Test
    public void test() {
        Cache<Object, Object> cache = Caffeine.newBuilder()
                .initialCapacity(100) //设置缓存的初始化容量
                .maximumSize(1000) //设置最大的容量
                .build();
    }

通过设置最大的容量来控制内存,当内存达到最大时,会将最早存入的数据删除,当缓存超出这个容量的时候,会使用Window TinyLfu策略来删除缓存。

2、基于时间(设置有效期)

复制代码
@Test
public void test1() {
    Cache<Object, Object> cache = Caffeine.newBuilder()
            .initialCapacity(100)
            .expireAfterWrite(Duration.ofSeconds(10)) //设置缓存的有效期,此时就是设置为10s
            .build();
}

3、基于引用

设置数据的强引用和弱引用,在内存不足的时候jvm会进行垃圾回收,会将弱引用的数据进行回收,性能差,不建议使用。

相关推荐
ofoxcoding5 天前
在AI API聚合平台配置DeepSeek V3.2提示词缓存实战:快速接入与成本优化指南
人工智能·spring·缓存·ai
NeilYuen5 天前
gRPC结合FAISS构建AI助手语义缓存模块(一):设计
人工智能·缓存·faiss
taocarts_bidfans5 天前
反向海淘跨境缓存架构优化:taocarts Redis分层缓存实战技术
redis·缓存·架构·反向海淘·taocarts
退休倒计时5 天前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
炘爚5 天前
Linux——Redis
数据库·redis·缓存
小挪号底迪滴5 天前
Redis 和 MySQL 数据不一致怎么办?缓存更新策略实战
redis·mysql·缓存
闪电悠米5 天前
黑马点评-Redis ZSet-实现关注 Feed 流
服务器·网络·数据库·redis·缓存·junit·lua
Saniffer_SH6 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
AC赳赳老秦6 天前
OpenClaw + 飞书多维表格:自动同步数据、生成统计图表、触发自动化任务
java·大数据·python·缓存·自动化·deepseek·openclaw